如何防止具有相同UpgradeCode / Version的WiX捆绑包安装两次

时间:2014-05-21 12:22:56

标签: wix windows-installer

我有一个与MSI打包在一起的应用程序,它与各种必需的第三方工具一起制作成WiX捆绑包。我已经在MSI du中禁用了应用程序如何工作的修改和修复操作,要求在再次安装相同版本之前完全卸载。

当我单独运行MSI时,它按预期工作:安装程序无法运行两次。再次运行完全相同的Bundle时也是如此。但只需重建捆绑包(使用相同的UpgradeCodeVersion),安装就会继续进行(这次要快得多),最后我会在已安装的程序中重复输入。我真的想要阻止它并使捆绑工作作为MSI。

我尝试过在捆绑上设置的各种条件; NOT WixBundleInstalledWixBundleInstalled != 1等等。但这似乎都不起作用。

供参考,这是捆绑声明:

<Bundle UpgradeCode="{FAF9CBDD-BE89-4B18-9921-FD5B426B5B0C}" IconSourceFile="$(var.SolutionDir)Resources\product.ico" 
          Name="Product 4.4" Version="4.4.0.0" Manufacturer="My Company" DisableModify="yes" Condition="NOT (WixBundleInstalled = 1)">

2 个答案:

答案 0 :(得分:0)

如果添加OptionalUpdateRegistration标记,您将在注册表中获得一个条目,您可以将其用作MSI包的InstallCondition

<OptionalUpdateRegistration ProductFamily="MyProductFamily" Name="MyAppBundle"/>
<util:RegistrySearch Id="SearchForMyProduct" 
                     Root="HKLM" 
                     Key="SOFTWARE\WOW6432NODE\MyCompany\Updates\MyProductFamily\MyAppBundle" 
                     Value="PackageVersion" 
                     Result="exists" />
<MsiPackage Id="MyMsi"
            InstallCondition=SearchForMyProduct
            DisplayName="My Wonderful Product"
            SourceFile="MyProduct.msi"
            ForcePerMachine="yes"/>

这将阻止新版本的软件包安装&#34; MyProduct&#34;再次。在您已经从MSI安装了捆绑包之后,这不会阻止捆绑包的安装。为此,您还可以为MSI创建的密钥添加RegistrySearch标记。

答案 1 :(得分:-1)

DisableRemove="yes"DisableModify="yes"添加到Bundle,将Visible="yes"添加到MSI。它可能只显示“删除/添加”程序中的MSI实例。

<Bundle Name="InstallerBoot" Version="$(var.BuildVersion)" Manufacturer="Company" UpgradeCode="GUID" DisableRemove="yes" DisableModify="yes">
    ...
    <MsiPackage Id="MainPackage" SourceFile="..\Installer.msi" DisplayInternalUI="yes" Compressed="yes" Vital="no" Visible="yes">
</Bundle>

然后为每个版本更改Bundle中的UpgradeCode。(在我的程序中,不要更改upgradeCode在安装msi后导致显示其他引导程序窗口)