Wix / Burn - 条件不运行MSIPackage因此不会卸载app

时间:2017-01-09 12:46:41

标签: wix install conditional-statements uninstall burn

我已经进入了一个状态,我的WiX Bootstrapper版本已经出现在现场,并且很难看到我如何能够解决新版本的问题。

基本上,那里的版本有几个安装SQL CLR&的MSIPackage元素。 SMO使用Mircosoft的标准MSI(SQLSysClrTypes.msi& SharedManagementObjects.msi) - 但不幸的是它们是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,那么产品是UNINSTALLED - 这显然不是我想要的。

我从来没有希望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;然后我不想做任何事情......当然不想用MSALackages调用它们,因为这会卸载它们。

我已经用各种各样的想法绞尽脑汁,但是在某些情况下,他们都会因为installCondition评估为false而最终删除了SMO。我想也许我可以有一些逻辑,在64位PC上安装x64版本,在32位PC上安装x86版本,但即使这样,至少有一个MSIPackage的安装条件会评估为假并最终删除一个版本!!

任何对此的帮助都会感激不尽!

干杯,

大克里斯。

1 个答案:

答案 0 :(得分:0)

MsiPackage has a property Permanent声明是否可以卸载程序包。将其设置为&#34;是&#34;将阻止捆绑包尝试卸载它。

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