使用WiX安装程序在安装任何版本之前强制卸载。

15

有人知道:

  1. 在安装新版本的安装程序之前,如何强制卸载先前安装的任何较小或较大的副本。

  2. 如果在运行新的次要/主要安装时无法执行第1步,那么我是否可以至少显示一条消息,表明检测到了先前的版本,并应首先卸载并取消安装程序?

谢谢。

更新:

我已将以下内容添加到我的 settings.wxi 文件中:

<Upgrade Id="$(var.UpgradeCode)">

    <!-- Populate NEWERPRODUCTFOUND if there is an installed 
         package with the same upgrade code
         and version is > the version being installed -->
    <UpgradeVersion
         Minimum="$(var.CurrentVersion)"
         IncludeMinimum="no"
         OnlyDetect="yes"
         Language="1033"
         Property="NEWERPRODUCTFOUND" />

    <!-- Populate UPGRADEFOUND if there is an installed 
         package with the same upgrade code
         and the version is between the earliest version defined
         and the version being installed -->
    <UpgradeVersion
         Minimum="$(var.FirstVersion)"
         IncludeMinimum="yes"
         Maximum="$(var.CurrentVersion)"
         IncludeMaximum="no"
         Language="1033"
         Property="PREVIOUSVERSIONSINSTALLED" />
</Upgrade>

我已经在MyProduct.wxs中定义了以下内容:

<?define CurrentVersion="5.0.0.18"?>
<?define FirstVersion="1.0.0.0"?>
<?define UpgradeCode="c1b1bfa0-9937-49eb-812c-5bac06eff858"?>

最后,我已将此添加到我的<InstallExecuteSequence>

<RemoveExistingProducts Before="InstallInitialize" />

但是当我把版本号提高到5.0.0.19时,它仍然没有删除旧版本。

也许我从错误的角度来看待这个问题,在我的"添加/删除程序"窗口中,我看到我的安装程序列为5.0.0.18,而我又看到第二个条目列为5.0.0.19。

每次更改版本号时,我应该更改升级代码吗?我记得读到过不应更改此代码。

有任何想法吗?

谢谢。


1
如果您知道所有可能的UpgradeCodes和ProductVersions,难道您不能制作自己的Upgrade元素来定位并升级它们吗? WiX MajorUpgrade可能已经足够了,但如果不是,您可以在Upgrade元素中列出所有内容。 - PhilDW
@PhilDW 感谢您的反馈。我会进一步研究它。我以前从未进行过升级,现在我正快要完成实际设置,所以我处于收集信息阶段。 - Thierry
2个回答

19

通过大量的搜索,我终于找到了答案!!Windows Installer没有考虑到版本号中的第4个数字,而我使用的版本号是5.0.0.18。

它只查看版本号的前3组数字。一旦我将版本号从5.0.18.0更改为5.0.19.0,它就立即与问题中发布的代码配合使用,并删除了以前的版本并安装了更新的版本。

请注意,我实际上已经删除了上面的代码,并最终使用了MajorUpgrade,因为那是我所需要的全部内容:

<MajorUpgrade
  AllowDowngrades="no"
  AllowSameVersionUpgrades="no"
  IgnoreRemoveFailure="no"
  DowngradeErrorMessage="loc.NewerVersionInstalled"
  Schedule="afterInstallInitialize"/>

希望这能帮助到其他人!


请明确一点,您是要更改产品代码和版本,对吗? - GTAE86

8
这里是 MajorUpgrade 元素的 AllowSameVersionUpgrades 属性文档,包含相关信息。重点在于:
当设置为 no(默认)时,安装具有相同版本和升级代码(但不同产品代码)的产品是允许的,并由 MSI 视为两个产品。当设置为 yes 时,WiX 设置 msidbUpgradeAttributesVersionMaxInclusive 属性,告诉 MSI 将具有相同版本的产品视为主要升级。 在两个产品版本仅在第四个版本字段上不同时,这很有用。MSI 在比较产品版本时特别忽略该字段,因此仅在第四个版本字段不同的两个产品是同一产品,并且需要将此属性设置为 yes 才能被检测到。 请注意,因为 MSI 忽略第四个产品版本字段,将此属性设置为 yes 还可以允许降级,当第一个三个产品版本字段相同时。例如,产品版本 1.0.0.1 将“升级”1.0.0.2998,因为它们被视为相同版本(1.0.0)。这可能会重新引入严重的错误,因此最安全的选择是更改前三个版本字段并省略此属性以获得默认值 no。
AllowDowngrades 也为“yes”时,此属性不能为“yes”-AllowDowngrades 已允许具有相同版本号的两个产品互相升级。
但是,根据第三段所述,将此属性设置为 yes 可能不是您想要的,因为版本 5.0.0.18 将被视为高于版本 5.0.0.19。将此属性设置为 no 并使用第三个产品版本字段仅允许升级。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接