使用Wix卸载MSI之前的自定义操作

时间:2013-07-11 07:22:28

标签: wix windows-installer

我使用Wix编写自己的MSI安装程序代码。我需要在卸载产品之前运行自定义操作,但之前删除任何注册表值或文件。我做了以下(只是为了尝试):

<Property Id='CALC'>Calc.exe</Property>
<CustomAction Id='BeforeUninstall01' Property='CALC' ExeCommand='' Return='check' />

<InstallExecuteSequence>
  <Custom Action='BeforeUninstall01' After='InstallInitialize'>Installed</Custom>
</InstallExecuteSequence>

如果我从控制面板中选择uninstall,它可以正常工作,但是如果我改为运行我的MSI(当它已经安装好了),那么无论如何都会触发BeforeUninstall01自定义操作,不该&#39;吨

知道如何改变这种情况吗?

2 个答案:

答案 0 :(得分:7)

您选择条件“已安装”。

根据您的代码,使用内置属性“REMOVE”的所需条件将导致:

<InstallExecuteSequence>
   <Custom Action='BeforeUninstall01' After='InstallInitialize'>REMOVE="ALL"</Custom>
</InstallExecuteSequence>

这也允许您(即使没有必要)卸载单个功能,但不允许您在没有触发自定义操作(ca)的情况下卸载整个产品。 换句话说,如果

,则始终只触发ca.

您的条件启动ca 始终,但不是第一次安装(包括修复,更新,卸载,修改,修补等等。这不是,您需要的,确实。

Reubz的情况略有不同,这将始终始终但不是首次安装而不是重大升级期间,这不是真正的改进。

关于排序: 如果您的ca确实需要提升权限,那么您必须使用系统权限运行自定义操作“deferred”并将您给定的ca定义更改为(如果不是,请允许):

<CustomAction Id='BeforeUninstall01' Property='CALC' ExeCommand='' Execute="deferred" Impersonate="no" Return="check" />

(我不是WiX向导,只有我非常了解MSI,所以我没有检查过你WiX代码的任何部分,只检查了问题。)

答案 1 :(得分:0)

尝试使用其他条件检查产品是否未升级

<Custom Action='BeforeUninstall01' After='InstallInitialize'>Installed AND NOT UPGRADINGPRODUCTCODE</Custom>