【问题标题】:How to prevent installation if other product is already installed, using Wix如果已经安装了其他产品,如何使用 Wix 阻止安装
【发布时间】:2016-10-05 02:36:01
【问题描述】:

我们有两种不同的产品,它们不能同时安装在同一台机器上而不会损坏,因此我们需要在 Wix 安装程序中为第一个产品添加一个检查,称为 A,以防止将其安装在一台机器已经安装了另一台机器,比如 B。

我们已经为 A 和 B 定义了不同的 UpgradeCodes,但是我需要添加什么到 Wix 安装 XML 中才能说出类似 "if you find anything with UpgradeCode A, don't install this, since this has UpgradeCode B". 的内容

我在这里看到了类似的问题 但是答案通常不提供清晰的 xml,并且只是部分相似,例如检查同一产品的 x86 与 64,或者只是阻止安装同一产品的旧版本,我们已经这样做了。这里几乎所有的 Wix 答案实际上都不包含 xml,我觉得这很奇怪,因为这是我知道如何定义这些东西的唯一方法。

关于这方面的 Wix 文档也很少,我发现了一些关于 AppSearch (http://wixtoolset.org/documentation/manual/v3/xsd/wix/appsearch.html) 的信息,但这并不能帮助我弄清楚如何在 xml 中使用它来阻止安装,如果找到了应用程序,或者如何通过 UpgradeCode 或其他方式搜索它。

【问题讨论】:

标签: installation wix


【解决方案1】:

您应该可以在产品 A 中添加一些升级检测:

<Upgrade Id="$(var.ProductBInstallerUpgradeGUID)" >
    <UpgradeVersion
        IncludeMaximum ="yes"
        IncludeMinimum="yes"
        Maximum="255.255.65535.65535"
        Minimum="1.0.0.0"
        MigrateFeatures="no"
        Property="PRODUCTBISINSTALLED"
        OnlyDetect="yes" />      
</Upgrade>

那么你可以使用启动条件

<Condition Message="!(loc.CannotInstallWithProductBInstalled)">NOT PRODUCTBISINSTALLED OR Installed</Condition>

因此,如果在这台机器上检测到产品 b,它将停止安装并显示由本地化文件中的“CannotInstallWithProductBInstalled”字符串定义的错误消息。

对于产品 B 中的产品 A 检测也是如此

【讨论】:

    【解决方案2】:

    您可以使用包含组件搜索的属性声明从其他已安装产品中搜索组件 ID,就像此处使用属性 ID 和 ComponentSearch 的示例:

    How to check for installed package in WiX 3.0?

    然后在启动条件下使用该属性。

    UpgradeCode 检测大部分时间都有效,但不能跨上下文工作。如果以前的产品是按机器(或按用户)安装的,而您的产品则相反,则升级搜索不会检测到它。假设所有安装都相同并在 InstallScope 中指定,那么 UpgradeSearch 就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      相关资源
      最近更新 更多