在卸载之前检查更高版本 - WIX

时间:2015-04-02 15:15:49

标签: visual-studio-2013 wix wix3.9

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

  • WebSite 1.0.0 - 基本文件(MajorUpgrade)
  • WebSite 1.0.1 - 对文件的次要更新
  • WebSite 1.1.0 - 基本文件(MajorUpgrade)

使用案例:WebSite 1.0.0和WebSite 1.0.1都使用MSI软件包安装在Web服务器上。当卸载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后,它将删除以前的版本,因为它具有所需的基本文件集。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

如果您需要阻止手动卸载1.0.0,那么您需要搜索(比方说)只存在于更高版本中的组件ID,并且您需要知道它们在旧版本中的含义版本,以便旧版本可以预测未来。或者您需要更高版本来创建1.0.0可以提前知道并在卸载期间搜索的注册表项。主要升级搜索无法找到任何内容,因为在卸载期间,FindrelatedProducts搜索没有进行重大升级。您需要搜索,组件,注册表或1.0.0知道将在更高版本中的内容。然后在启动条件中使用该属性以防止卸载。

另一种可能性是在升级代码上调用MsiEnumrelatedProducts()或等效的自定义操作。这将返回一系列ProductCodes,您可以为其调用MsiGetProductInfo()以获取产品版本,然后检查相关的值。这具有以下优点:旧产品不需要事先知道注册表条目或组件ID,因为升级代码更可预测并且它们在一系列产品中更不可能改变。