WIX:仅防止更新某些旧版本

WIX: Prevent only CERTAIN older versions from being updated

我们有一些产品使用 WIX 作为安装程序技术。安装程序中的升级处理由 MajorUpgrade element

处理
<Wix>
  <Product Id="..." Name="..." Language="..."
    Version="..." Manufacturer="..."
    UpgradeCode="...">
...

    <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" AllowSameVersionUpgrades="yes" />
  </Product>
</Wix>

如您所见,到目前为止,我们支持从所有旧版本升级,但是我们必须稍微更改一下,以便只能升级比特定版本新的版本,而旧版本会收到错误消息和升级失败。

根据我的研究,这应该可以通过 Upgrade 元素实现(如 https://www.firegiant.com/wix/tutorial/upgrades-and-modularization/checking-for-oldies/ 中所述)

我现在的问题:

更新

感谢回复和解答,我使用的解决方案如下:

<Wix>
  <Product Id="..." Name="..." Language="..."
    Version="..." Manufacturer="..."
    UpgradeCode="My_upgrade_code">
...

    <InstallExecuteSequence>
...
      <Custom Action='UpdateFromVersionNotSupported' After='FindRelatedProducts'>UNSUPPORTEDUPDATEVERSIONFOUND</Custom>
...
    </InstallExecuteSequence>
    <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" AllowSameVersionUpgrades="yes" />

    <Upgrade Id='My_upgrade_code'>
        <UpgradeVersion OnlyDetect='yes' Property='UNSUPPORTEDUPDATEVERSIONFOUND' Maximum='Oldes_version_where_update_is_allowed' IncludeMaximum='no' />
    </Upgrade>

    <CustomAction Id='UpdateFromVersionNotSupported' Error='Updates are only supported from version ?? or later' />

  </Product>
</Wix>

您需要使用升级元素。

https://wixtoolset.org/documentation/manual/v3/xsd/wix/upgrade.html

https://wixtoolset.org/documentation/manual/v3/xsd/wix/upgradeversion.html

您需要编写 2 条规则。一个允许升级到版本 X 或更高版本的版本。这可以是您的标准 MajorUpgrade 元素。另一个检测版本

应该有几种方法:

  1. New UpgradeCode: 更改升级代码会解耦旧版本和新版本吗?您可以将两个升级代码都添加到升级 table 并以不同方式处理它们。见下图和:

  2. Versioning:您也可以使用版本匹配来仅升级某些 MSI 版本。 Upgrade Table documentation。换句话说,将最大和最小版本设置为每个升级 table 条目的目标。您可以不断添加行以不同方式处理不同的版本。像这样的东西(只是一个粗略的模型):

WiX Constructs:您可以混合搭配现代 WiX 便利元素 与旧的和更灵活的元素。 .

Side-By-Side MSI:注意如果要install the same MSI twice on the same computer interference will result unless you do work to isolate the instances (COM servers, file associations, services, etc... - anything machine-wide and interference capable). The worst of it is generally things registered system-wide accessed via the registry (unless it is multi-instance capable). More technical information here。虚拟化有帮助吗?有关详细信息,请参阅链接。