【问题标题】:How to execute a custom action before all of other actions (include standard and custom actions)如何在所有其他操作之前执行自定义操作(包括标准和自定义操作)
【发布时间】:2017-12-11 11:28:46
【问题描述】:

我正在尝试在 wix 安装程序中执行我的自定义操作,以删除之前在 InstallExecuteSequence 中写入的注册表项,然后再安装软件,如下所示:

 <InstallExecuteSequence>
      <Custom Action="RemoveExistingReristryKey" Sequence="150">NOT Installed</Custom>
 </InstallExecuteSequence>

运行 .msi 文件时,调用了函数 RemoveExistingReristryKey 并删除了注册表项,我可以看到日志:

... 行动于 17:12:59 结束:CostFinalize。返回值 1。

MSI (c) (90:54) [17:12:59:596]:执行操作:RemoveExistingReristryKey 行动 17:12:59:RemoveExistingReristryKey。 动作开始时间 17:12:59:RemoveExistingReristryKey。 MSI (c) (90:E4) [17:12:59:616]:调用远程自定义操作。 DLL:C:\Users\CUONG~1.HUY\AppData\Local\Temp\MSIF947.tmp,入口点:_RemoveExistingReristryKey@4 MSI (c) (90:8C) [17:12:59:616]:启用隐形。 MSI (c) (90:8C) [17:12:59:616]:在调用 Install on Server 之前尝试启用所有禁用的权限 MSI (c) (90:8C) [17:12:59:616]:连接到 CA 接口的服务。 RemoveExistingReristryKey:已删除先前安装的注册表项。 操作于 17:12:59 结束:RemoveExistingReristryKey。返回值 1。

MSI (c) (90:54) [17:12:59:668]:执行操作:MaintenanceWelcomeDlg ...

但是,我想修复的错误仍然发生,但是,如果我手动删除此注册表项,错误就会消失。

我认为我的自定义操作执行得太晚了,所以我尝试通过自定义操作的一些选项进行编辑,例如:在 InstallExecuteSequence 中的之前、之后、序列以立即执行此自定义操作并在所有其他操作之前执行,但它仍然不是,它总是在标准操作“CostFinalize”之后执行。

如何在运行 .msi 文件以删除注册表项时立即执行我的自定义操作?

非常感谢!

【问题讨论】:

  • 我有点困惑。听起来您正在尝试删除在安装过程中也写入注册表的密钥。大概您只需要部分安装的注册表项,并且在安装完成之前需要它吗?
  • @CalumMacLeod 我有一个错误如下:安装我的软件时,如果我们在特殊情况下取消此过程(出现提取对话框时取消),我们无法重新安装此软件,因为之前在 SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products 中创建了一个注册表项...如果我手动删除此注册表项,我可以正常重新安装我的软件,所以我想在安装之前在 wix 中进行自定义操作以删除此注册表,但是,我的自定义操作似乎执行得太晚了,所以我无法重新安装我的软件。
  • 因此,我想在 wix 的所有其他操作之前立即执行我的自定义操作。

标签: windows wix registry installation


【解决方案1】:

我对您要做什么感到困惑,但是,对我来说,听起来您实际上是在尝试管理自定义操作何时发生 - 您有两个,它们发生在错误的顺序。

我有两条建议:如果您真的希望一个自定义操作在另一个之前发生,请在 InstallUISequence 中安排第一个自定义操作,在 InstallExecuteSequence 中安排第二个自定义操作. InstallUISequence 发生在 InstallExecuteSequence 之前。

第二个是使用ORCA 真正查看您的自定义操作何时发生。使用 ORCA 打开您的 .msi 文件,然后转到 InstallExecuteSequence 表,然后单击序列列以按“操作发生时间”进行排序。

这是我拥有的 MSI 中的一个示例:

在此示例中,我有两个自定义操作(带圆圈),我必须一个接一个。为了做到这一点,我做了以下事情:

<InstallExecuteSequence>
     <Custom Action="SetCustomAction_EncryptKey"
             After="InstallInitialize"/>
     <Custom Action="CustomAction_EncryptKey"
             After="SetCustomAction_EncryptKey"/>
</InstallExecuteSequence>

这保证了一个接一个发生。话虽如此,我也可以这样做,以确保第二个动作不一定发生在下一个动作,而是第一个动作之后的一个动作:

<InstallUISequence>
     <Custom Action="SetCustomAction_EncryptKey"
             Before="CostFinalize"/>
</InstallUISequence>
<InstallExecuteSequence>
     <Custom Action="CustomAction_EncryptKey"
             Before="CostFinalize"/>
</InstallExecuteSequence>

无论如何,我发现 ORCA 是一个工具,它揭开了整个“何时安排自定义操作”的神秘面纱。

【讨论】:

  • 嗨。我试图这样做,但我观察到 InstallUISequence 在通过双击运行 msi 时没有执行(通过 cmd 运行它很顺利)。我在代码中有一个 UI 元素,这可能是任何原因吗?或者你有什么意见?
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多