【问题标题】:Persistence of data for MSI installationMSI 安装的数据持久性
【发布时间】:2019-02-22 10:15:04
【问题描述】:

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

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

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

  • 何时删除外部文件。
  • 什么时候发现这个函数调用是第一次调用(动作/函数调用Before="LaunchConditions"可能有帮助,不是很确定)。

如果我无法删除文件,我无法知道“信息”是最新的还是陈旧的(即属于先前失败/成功的 MSI 运行)。

“临时 MSI 表”我听说过,但不知道如何使用。

【问题讨论】:

  • 也许您可以简要描述一下您的自定义操作是做什么的?我们经常发现它们可以被标准结构和/或应用程序启动顺序调整所取代。
  • 我所关心的,确实处理现有的复杂设置(非 MSI),它需要保留有关现有设置的信息(文件/注册表/某些状态等)。这是必需的,以便当 MSI 失败时,自定义操作可以返回到旧的设置/安装。无法(相信这一点)将其保存在 MSI 中,必须手动完成。

标签: c++ windows wix windows-installer data-persistence


【解决方案1】:

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

迁移建议(请认真考虑这个选项):您能否安装新的 MSI 软件包并删除所有快捷方式并在离开旧应用程序时访问它 而是安装?您的新应用程序版本安装到新路径 和一个新的注册表配置单元,然后您首先迁移所有设置 启动新应用程序,然后开始卸载 旧应用程序 - 不知何故 - 或者只是安装它 可以接受吗?您的旧安装中有 COM 服务器吗?其他有全局注册的东西?

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


保存设置和数据:关于在运行的 MSI 实例中保存数据和设置,内置机制基本上是使用Session.Property(@ 987654335@ / VBScript) 或 MsiSetProperty (Win32) 来电。这允许您在 MSI 的 Session 对象中保留字符串。全局数据的排序。

注意,属性只能在即时模式(不改变系统的自定义操作)下设置,将数据发送到延迟模式自定义操作(可以改变系统)是相当的涉及围绕CustomActionData 概念(more on deferred mode & CustomActionData)。

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

替代方案?:涉及到这种设置属性方法。有些人在安装过程中写入和写入 registry,或写入 temp 文件(在 temp 文件夹中),然后他们在 MSI 的提交阶段进行清理,但我不喜欢这种方法有几个原因。一方面,提交自定义操作可能不会根据目标系统上的策略运行(when rollback is disabled, no commit script is created - 请参阅“提交执行”部分)和it isn't best practice。添加 临时行 是一个有趣的选项,我从来没有花太多时间在上面。我怀疑您是否能够轻松地使用它来实现您的需求,尽管我并不真正了解您的详细需求。我没有正确使用它。 Quick sampleThis RemoveFile example from WiX 可能会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多