防止多次安装

时间:2016-04-27 00:31:07

标签: windows wix windows-installer

我正在使用WiX Toolset 3.10.2为我的产品构建安装程序。

在解决方案中有两个WIX项目,一个从已编译的二进制文件构建MSI,另一个使用WixStandardBootstrapperApplication从MSI构建setup.exe。

如果我增加版本,它可以正常工作,提供升级。

如果我第二次启动相同的安装程序,它可以正常工作,打开“修改设置”屏幕。

问题是,在我重建安装程序而不增加版本后,它无法检测到先前的安装,并且很高兴第二次安装(因此“卸载”控制面板有多个相同的项目。)

如何停止,只允许单个已安装的产品实例?

MSI:

<?include "..\Version.wxi"?>

<Product Id="*" Name="xxx" Language="1033" Version="$(var.vvvVersion)"
        Manufacturer="yyy" UpgradeCode="0d88cab0-d278-43bb-b891-607bc01c4dec" >
    <MajorUpgrade DowngradeErrorMessage="A newer version of xxx is already installed." />

EXE:

<?include "..\Version.wxi"?>

<Bundle Name="xxx" Manufacturer="yyy" Version="$(var.vvvVersion)"
        UpgradeCode="eac46fb0-09d1-4c29-8fc1-984dddb35e50"
        IconSourceFile="$(var.SolutionDir)applicationIcon.ico" >

1 个答案:

答案 0 :(得分:2)

如果当前安装的软件包的版本是&lt; =已安装的软件包的版本,则捆绑软件的默认行为是保留先前的软件包。

有两种方法可以解决这个问题。一个实现起来相对简单,另一个需要编辑引导程序应用程序的代码。

正如您所指出的,解决此问题的第一种方法是将引导程序的版本与代码的内部版本号或修订版号绑定,以便版本的一部分始终增加。这样,引导程序始终知道删除以前安装的bundle exe。需要注意的是,Bootstrapper应用程序确实考虑了版本的全部4个部分,而不像MSI那样丢弃了第4个数字。这是我在bootstrapper应用程序中实现的解决方案。

解决此问题的第二种方法是覆盖OnPlanRelatedBundle中的requestedState。 (供参考https://sourceforge.net/p/wix/bugs/3065/