Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序

Posted

技术标签:

【中文标题】Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序【英文标题】:Wix/Burn - condition to not run MSIPackage and thus not uninstall app 【发布时间】:2017-05-23 17:42:20 【问题描述】:

我的 WiX Bootstrapper 版本已经投入使用,我已经进入了一些状态,我正在努力寻找如何解决新版本的问题。

基本上,现有的版本有几个 MSIPackage 元素,它们使用 Mircosoft 的标准 MSI(SQLSysClrTypes.msi 和 SharedManagementObjects.msi)安装 SQL CLR 和 SMO - 但不幸的是它们是 x64 版本。现在这对于 64 位 PC 来说没问题(因为我们的应用程序可以使用 64 位版本)等等这些 PC 都可以。但很明显,当有人尝试在 32 位机器上安装它时,它会失败。

那么,我希望新的 setup.exe 做什么;是检测是否安装了 64 位版本及其版本(我通过注册表搜索进行);如果是,则不要执行任何操作(即不要安装 x86 版本)。还检测是否安装了 x86 版本及其版本(我可以再次这样做) - 然后只安装 x86 版本;如果未安装 x86 或 x64 版本(或者它们不是正确的版本 - 在本例中为 v13.0.1601.5)

我的逻辑是:

    <util:RegistrySearch Id="IsSMOInstalledx86"
        Root="HKLM"
        Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion"
        Value="Version"
        Result="value"
        Variable="SMOVersionx86"/>

<util:RegistrySearch Id="IsSMOInstalledx64"
        Root="HKLM"
        Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion"
        Value="Version"
        Win64="yes"
        Result="value"
        Variable="SMOVersionx64"/>

      <MsiPackage SourceFile="$(var.DependenciesPath_Microsoft)\System CLR Types for SQL Server 2016\v13.0.1601.5\SQLSysClrTypes.msi"
              Id="SQLCLR"
              DisplayName="System CLR Types for SQL Server 2016"
              Visible="yes"
              InstallCondition="(SMOVersionx86 &lt;&gt; &quot;13.0.1601.5&quot;) AND (SMOVersionx64 &lt;&gt; &quot;13.0.1601.5&quot;)"
              SuppressSignatureVerification="yes"/>

  <MsiPackage SourceFile="$(var.DependenciesPath_Microsoft)\Shared Management Objects\v13.0.1601.5\SharedManagementObjects.msi"
              Id="SQLSMO"
              After="SQLCLR"
              DisplayName="Shared Management Objects for SQL Server 2016"
              Visible="yes"
              InstallCondition="(SMOVersionx86 &lt;&gt; &quot;13.0.1601.5&quot;) AND (SMOVersionx64 &lt;&gt; &quot;13.0.1601.5&quot;)"
              SuppressSignatureVerification="yes"/>

但我的问题是,当它在 64 位 PC(已安装 SMO)上运行时 - InstallCondition 评估为 FALSE 并且正如 WiX 文档明确指出的那样;如果它的评估结果为 FALSE,则该产品已卸载 - 这显然不是我想要的。

从不存在我希望 InstallCondition 评估为 FALSE 的情况,即我永远不应该卸载 SMO(如果没有其他原因,用户可能已经安装了它以供其他应用程序使用,即不是我们的应用程序)。我可以删除 installCondition,然后它只会在 32 位和 64 位机器上安装 x86 版本 - 这很好;但有点不合时宜。

所以,我想用伪代码做的是:

If SMOVersionx86 <> "13.0.1601.5" AND SMOVersionx64 <> "13.0.1601.5"
then
    call the MSIPackages (with no installcondition or always TRUE) to INSTALL
else
    don't call the MSIPackages"
Endif

即如果条件结果为 FALSE;那么我不想做任何事情......当然不想用 FALSE 调用 MSIPackages,因为这会卸载它们。

我绞尽脑汁想出了各种各样的想法,但在某些情况下,它们都最终导致 installCondition 评估为 false,因此最终删除了 SMO。我想也许我可以有一些逻辑,在 64 位 PC 上安装 x64 版本,在 32 位 PC 上安装 x86 版本,但即便如此,至少 MSIPackage 的安装条件之一将评估为假并最终删除一个版本!

我们将不胜感激地收到任何帮助!

干杯,

大克里斯。

【问题讨论】:

【参考方案1】:

MsiPackage has a property Permanent 声明是否可以卸载包。将其设置为“yes”将阻止捆绑包尝试卸载它。

但是,我不确定将该属性添加到新包中是否会阻止旧包卸载它。

【讨论】:

以上是关于Wix/Burn - 不运行 MSIPackage 的条件,因此不卸载应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Wix Burn exepackage 属性

WiX - Burn 支持两用 msi 包吗?

WiX Burn:从注册表中读取 LaunchTarget

如何为 Wix Burn 安装程序包含完整的 .NET 先决条件

自定义 WiX Burn 引导程序用户界面?

Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面