Wix:执行已安装的exe作为卸载的第一个操作

时间:2015-11-04 04:07:40

标签: wix windows-installer

在我的msi中,我必须使用一些参数调用已安装的exe文件,这是卸载的第一个操作。这是代码:

<CustomAction Id="UnRegisterOnUninstallApplication"
              Execute="immediate"
              FileKey="MyProgram.exe" ExeCommand="/unregister"  Return="asyncNoWait" />

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallInitialize"/>
  <Custom Action="UnRegisterOnUninstallApplication"  Before="UnpublishComponents" >Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>

虽然它是在UnpublishComponents之前安排的,但问题是,在某些计算机上,在卸载依赖dll期间或之后调用自定义操作,因此MyProgram.exe在这里崩溃。 这似乎是不可预测的......

任何人都可以指导,如果我遗漏了什么或做错了什么? 非常感谢。

2 个答案:

答案 0 :(得分:2)

这里有几件事不正确:

  1. 设计问题是您不应该运行代码来注册或取消注册。建议的方法是捕获注册表项并将它们作为注册表项添加到与该二进制文件相同的组件中。然后一切正常。

  2. 您的自定义操作是asyncNoWait,这意味着在程序运行时继续卸载。如果由于某种原因需要很长时间,或者根本没有足够的处理器,那么是的,文件可能在运行时已被删除。

  3. 它是一个立即的自定义操作,因此它可以在卸载过程中运行并开始取消注册。但是,如果卸载失败并且回滚已删除的注册将无法恢复,那么您最终仍会安装已损坏的产品,这些注册条目将保持删除状态。它应该是延迟的自定义操作并返回=忽略或检查,具体取决于您是否关心程序是否失败。

答案 1 :(得分:0)

我可能会在“RemoveFiles”之前安排操作,以便在自定义操作运行之前没有删除任何依赖dll。