2015-04-02 120 views
0

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

  • 网页1.0.0 - 基本文件(MajorUpgrade)
  • 网页1.0.1 - 小更新文件
  • 网页1.1.0 - 基本文件(MajorUpgrade)

使用案例: 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时,它将删除以前的版本,因为它具有所需的基本文件集。

+0

如果您需要阻止手动卸载1.0.0,那么您需要搜索(说)在更高版本中存在的组件ID。或者您需要更高版本来创建1.0.0可以提前知道的注册表项并在卸载期间进行搜索。主要升级搜索找不到任何内容,因为它在卸载期间不运行。您需要搜索,组件,注册表或1.0.0知道的更新版本。然后在启动条件中使用该属性来防止卸载。我假设你的字面意思是“防止卸载”的1.0.0,它没有错别字。 – PhilDW 2015-04-03 18:23:51

+0

好的,这是一个很好的建议。是的,我的意思是防止卸载。你能用注册表例子写出一个答案,这样我就可以正确标记了吗? – Jerode 2015-04-06 13:55:07

回答

1

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

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

2

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

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

如果您使用的是IsWiX(CodePlex)项目模板,则默认情况下会创作该模板。这个想法是覆盖最常见的需求和用例,所以你甚至不知道你首先遇到了问题。

+0

好的,我会再试一次。我试过这个用例,我可以删除WebSite 1.0.0和WebSite 1.0.1仍然安装。我很快接触基地。 – Jerode 2015-04-02 20:15:32

+0

我没有通过使用MajorUpgrade标签运行,并没有得到预期的结果。 MajorUpgrade将在安装时删除以前安装的产品,这不是我需要的结果。对于文件更新,我需要保留原始文件。 – Jerode 2015-04-02 23:29:49

+0

MajorUpgrade还可以使用DetectOnly属性检测产品。 DowngradeErrorMessage作者就是这样。 – 2015-04-02 23:33:07