MSI 安装的数据持久化

Persistence of data for MSI installation

MSI 安装会调用我的 (native/C++) 自定义操作函数。由于 DLL 是新加载的,并且 MSIEXEC.EXE 进程是为每个函数单独启动的(可调用操作,如 MSI/WiX 脚本中指定的那样),我无法在 C/C+ 中使用任何全局数据+ 程序。

我如何(或在哪里)存储有关正在进行的安装的一些信息? 我不能使用命名对象(如共享内存),因为启动 DLL 以调用 "action" 函数的 "process" 会退出,并且 OS 不会保留命名对象。

我可能会使用外部文件来存储,但我怎么知道(在DLL的函数中):

如果我无法删除文件,我无法知道 "information" 是最新的还是过时的(即属于较早的 failed/succeeded MSI 运行)。

"Temporary MSI tables"听说过,不知道怎么用

Preserve Settings:老实说,我有点搞不清楚你的自定义操作是做什么的。但是,听起来他们保留了旧应用程序和安装版本的设置,并在 MSI 无法正确安装时将它们放回原处?

Migration Suggestion (please seriously consider this option): Could you install your new MSI package and delete all shortcuts and access to the old application whilst leaving it installed instead? Your new application version installs to a new path and a new registry hive, and then you migrate all settings on first launch of the new application and then kick off the uninstall of the old application - somehow - or just leave it installed if that is acceptable? Are there COM servers in your old install? Other things that have global registration?

自定义动作禁欲:以上只是避免自定义动作的建议。 (反对自定义操作的宣传片)。如果您在应用程序启动时迁移设置,您可以避免所有 sequencingconditioningimpersonation 问题以及您已经面临的与自定义操作相关的 technical issues(还有更多)采用。至关重要的是,您处于熟悉的 debugging context(应用程序启动代码)中,而不是陌生的设置世界及其糟糕的调试性。


Preserving Settings & Data:关于在 运行ning MSI 实例中保存数据和设置,内置的in 机制基本上是使用 Session.Property (COM / VBScript) 或 MsiSetProperty (Win32) 调用来设置属性。这允许您在 MSI 的 Session 对象中保留字符串。全球数据排序。

请注意,属性只能在立即模式(不改变系统的自定义操作)下设置,并将数据发送到延迟模式自定义操作(可以使系统更改)非常涉及围绕 CustomActionData concept (more on deferred mode & CustomActionData)。

本质上,您通过立即模式下的 SetProperty 自定义操作将字符串发送到延迟模式自定义操作。通常是一个 "home grown" 分隔的字符串,您在立即模式下构造它,并在延迟模式下接收它时将其分解成信息片段。您可以尝试 use JSON-strings 和类似的方法,通过 JSON 字符串对对象进行序列化和反序列化,从而使传输更容易、更可靠。

Alternatives?:这个set 属性方法涉及。有些人在安装期间写入和写入注册表,或者写入临时文件(在临时文件夹中),然后他们在提交期间清理MSI 的阶段,但我不喜欢这种方法有几个原因。一方面,根据目标系统上的策略,提交自定义操作可能不会 运行(when rollback is disabled, no commit script is created - see "Commit Execution" section), and . Adding temporary rows is an interesting option that I have never spent much time on. I doubt you would be able to easily use this to achieve what you need, although I don't really know what you need in detail. I haven't used it properly. Quick sample. This RemoveFile example from WiX 可能更好。