如果CustomAction中有错误,如何强制WiX卸载

时间:2011-02-11 22:44:29

标签: wix windows-installer custom-action

我有以下CustomAction:

<CustomAction Id="ActionName"
              After="InstallFinalize">
  <![CDATA[NOT Installed AND (VSTORUNTIME4="#1")]]>
</CustomAction>

问题是当我返回ActionResult.Failure时,CustomAction中存在一个案例。在这种情况下,安装程序将显示错误消息并说安装失败,但应用程序仍然部分安装(文件已经在Program Files中,应用程序显示在卸载程序中)。

我希望如果我返回ActionResult.Failure,那么安装将被中止并卸载。如果自定义操作在默认的Visual Studio安装程序中失败并且我认为它更有意义,则会发生这种情况。

如果自定义操作失败,有人知道如何触发卸载吗?我是否需要为WiX XML添加额外的东西?

3 个答案:

答案 0 :(得分:7)

目前,您的自定义操作是在安装事务完成后安排的(After =“InstallFinalize”)。可以回滚的唯一自定义操作是在“InstallInitialize”和“InstallFinalize”之间安排的“延迟”自定义操作。对于延迟的自定义操作,您还应该在其之前安排回滚自定义操作。

答案 1 :(得分:2)

默认情况下,Windows Installer支持事务性故事,能够回滚对系统的所有更改。问题是,您在做什么自定义操作以及在何处/如何安排它们?

如果您的CustomActions正在以事务方式更改机器状态,则安装程序无法回滚代码导致的进程外更改。

这里有几篇很好的阅读文章:

Installation Phases and In-Script Execution Options for Custom Actions in Windows Installer

Zataoca: Classes of Custom Actions

Zataoca: Custom actions should be data driven.

Zataoca: Custom actions are (generally) an admission of failure.

答案 2 :(得分:0)

我认为您需要做的是在您的习惯中添加“Return”项,然后如果自定义操作返回值no-zero,您的安装将失败并回滚。

您需要做的是确保您的惯例在失败时返回非零值。

              ExeCommand = “[INSTALLLOCATION] BeforeUnstall.bat”               执行=“延期”               返回=“检查”               HideTarget = “不”               Impersonate =“no”/&gt;