Wix-延迟的自定义操作在升级时失败,导致产品被完全删除

Wix-延迟的自定义操作在升级时失败,导致产品被完全删除,wix,windows-installer,upgrade,rollback,custom-action,Wix,Windows Installer,Upgrade,Rollback,Custom Action,设置 因此,我有一个自定义操作,它被标记为延迟,并在InstallFinalize之前执行。看起来是这样的: <CustomAction Id="CADeferred" BinaryKey="binaryCustomActions" DllEntry="CADeferredMethod" Execute="deferred"/> <InstallExecuteSequenc

设置

因此,我有一个自定义操作,它被标记为延迟,并在InstallFinalize之前执行。看起来是这样的:

  <CustomAction Id="CADeferred"
                BinaryKey="binaryCustomActions"
                DllEntry="CADeferredMethod"
                Execute="deferred"/>

  <InstallExecuteSequence>
  ...
  <Custom Action="CADeferred"
          Before='InstallFinalize'>Not Installed or Upgrading</Custom>
  </InstallExecuteSequence>

...
未安装或未升级
我已经在计算机环境中安装了1.0版&功能齐全。然后我使用2.0版MSI进行升级

我遇到的问题

升级时,该自定义操作可能会失败并返回
ActionResult.Failure
。出现这种情况时,安装程序会失败并说:

“由于出现错误,产品安装向导提前结束。您的 系统尚未修改。若要稍后安装此程序, 再次运行安装向导。单击“完成”按钮退出安装程序 向导。”

一旦我点击Finish。我检查了产品本身是否已完全从计算机环境中删除。就像它已经基本上被卸载了一样

我希望它能像升级前一样回滚到1.0版

我正在努力实现的目标

如果出现这种情况,我希望安装程序在环境上回滚到1.0版

我到目前为止所做的事情

我在谷歌上搜索了更多关于InstallFinalize如何工作、回滚如何工作等信息

根据我的研究,在InstallFinalize之前运行一个延迟的自定义操作是需要修改环境状态的自定义操作的方法。同时,还可以在新安装程序上使用新文件,例如DLL,因为它在InstallFinalize步骤中运行。因为它是在InstallFinalize之前定义的,所以我认为回滚它会使系统恢复到以前安装的产品版本

我已经尝试将它变成一个在InstallFinalize之后立即运行的自定义操作,但这很糟糕。如果失败,该产品仍将升级到2.0版。这很奇怪。而且我知道这是不赞成的。所以我在InstallFinalize之前运行了延迟的自定义操作

我还了解到,通常延迟的自定义操作有一个与之关联的回滚自定义操作。但是,由于延迟自定义操作的功能性,我们不一定能用回滚自定义操作解决这个问题。原因是需要管理员真正检查故障,并手动执行下次重试升级所需的任何更改。因此,我们不包括关联回滚自定义操作


所以在这一点上我很困惑。任何帮助或指导都将不胜感激。如果我不够清楚,请随时要求更多的澄清。请并感谢您。

请阅读以下MSI SDK的说明:。从本质上讲,标准操作RemoveExistingProducts的位置将影响回滚的工作方式,以及它是否有效。此标准操作在主要升级过程中运行旧安装程序的卸载-这实际上不是升级,而是旧产品的卸载和新产品的安装-具有几种不同的“风格”顺序-换句话说,首先发生的是卸载或安装

后期
RemoveExistingProducts
排序允许正确回滚(SDK文章中的详细信息链接到上面)。如果要使
RemoveExistingProducts
的后期放置正常工作,您必须小心不要违反组件规则,否则如果您延迟卸载,更新后的文件将丢失。这是因为在这种情况下,新版本将作为修补程序安装。它修补更改的文件,然后删除任何过时的文件。在早期卸载场景中,您将自己从这些引用计数问题中“解耦”——在安装新产品之前,旧产品已完全消失——因此您无法回滚到它(除非手动重新安装)。换句话说:早期的
移除现有的产品
它更能原谅设置设计错误,因此在现实世界中使用得更多

主要升级的配置由或决定


某些链接

  • (不太相关,离开链接)

Hi@Stein,很高兴收到你的来信(你曾经在一个不同的Wix问题上帮助过我一次)。感谢您提供有关RemoveExistingProducts的信息。我不知道这可能会被移动,产生不同的结果。我感觉升级是卸载旧版本,然后安装新版本。现在你已经澄清了这一点。我将与我的团队一起运行这个步骤,看看我们是否应该进一步研究这一步骤,并从中看到结果。我会通知你的,再次谢谢。