防止多次安装

Prevent multiple installs

我正在使用 WiX 工具集 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" >

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

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

如您所述,解决此问题的第一种方法是将引导程序的版本与代码的内部版本号或修订号相关联,以便版本的一部分始终增加。这样引导程序总是知道删除以前安装的 bundle exe。请注意,Bootstrapper 应用程序 确实 考虑了版本的全部 4 个部分,这与 MSI 的版本不同,后者会丢弃第 4 个数字。这是我在引导程序应用程序中实现的解决方案。

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