【问题标题】:How to force WiX to uninstall if there is an error in CustomAction如果 CustomAction 出现错误,如何强制卸载 WiX
【发布时间】:2011-02-11 22:44:28
【问题描述】:

我有以下 CustomAction:

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

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

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

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

【问题讨论】:

    标签: wix windows-installer custom-action


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      如果您的 CustomAction 正在更改机器的状态,他们需要以事务方式这样做,否则安装程序无法回滚您的代码导致的进程外更改。

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

      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.

      【讨论】:

        【解决方案3】:

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

        您需要做的是确保您的自定义操作在失败时返回非零值。

        ExeCommand="[INSTALLLOCATION]BeforeUnstall.bat" 执行="延迟" 返回=“检查” 隐藏目标=“否” Impersonate="no" />

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-07
          • 2015-06-08
          • 2014-02-20
          相关资源
          最近更新 更多