我有以下CustomAction:
<CustomAction Id="ActionName"
After="InstallFinalize">
<![CDATA[NOT Installed AND (VSTORUNTIME4="#1")]]>
</CustomAction>
问题是当我返回ActionResult.Failure时,CustomAction中存在一个案例。在这种情况下,安装程序将显示错误消息并说安装失败,但应用程序仍然部分安装(文件已经在Program Files中,应用程序显示在卸载程序中)。
我希望如果我返回ActionResult.Failure,那么安装将被中止并卸载。如果自定义操作在默认的Visual Studio安装程序中失败并且我认为它更有意义,则会发生这种情况。
如果自定义操作失败,有人知道如何触发卸载吗?我是否需要为WiX XML添加额外的东西?
答案 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;