卸载前检查更新版本 - WIX

Check for later versions before uninstalling - WIX

如果安装了同一产品的多个版本,是否可以使用 属性 检查更新版本并添加条件消息并防止卸载?

用例:WebSite 1.0.0 和 WebSite 1.0.1 都使用 MSI 包安装在网络服务器上。卸载 WebSite 1.0.0 时,如果存在更新版本,我需要能够防止这种情况发生。

我考虑过使用条件,但不确定这是否是最好的方法。

<Condition Message="Newer version of the product must be removed">
    Installed OR PRODUCTVERSION > 1.0.0
</Condition>

安装 WebSite 1.1.0 时,它将删除以前的版本,因为它具有所需的基本文件集。

MajorUpgrade 元素使用 1 个属性处理所有这些。

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

如果您使用的是 IsWiX (CodePlex) 项目模板,则默认情况下是开箱即用的。这个想法是为了涵盖最常见的要求和用例,所以您甚至不知道自己遇到了问题。

如果您需要防止手动卸载 1.0.0,那么您需要搜索(比如说)一个仅存在于更高版本中的组件 ID,并且您需要知道它们在旧版本中是什么版本,以便旧版本可以预测未来。或者您需要更高版本来创建 1.0.0 可以提前知道并在卸载期间搜索的注册表项。主要升级搜索不会找到任何东西,因为主要升级 FindrelatedProducts 搜索在卸载期间没有 运行。您需要搜索、组件、注册表或 1.0.0 知道会出现在更高版本中的东西。然后在启动条件下使用 属性 来防止卸载。

另一种可能性是在升级代码中调用 MsiEnumrelatedProducts() 或等效项的自定义操作。这将 return 一系列 ProductCodes,您可以调用 MsiGetProductInfo() 获取产品版本,然后检查相关值。这样做的好处是,旧产品不需要提前知道注册表项或组件 ID,因为升级代码更可预测,并且它们不太可能在一系列产品中发生变化。