2016-04-27 78 views
1

我使用WiX Toolset 3.10.2为我的产品构建安装程序。防止多次安装

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

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

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

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

如何阻止该问题,并且只允许单个安装的产品实例?

微星:

<?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" > 

回答

2

这是离开前一个包后面如果当前安装包的版本是<捆绑的默认行为=到已安装的软件包版本。

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

正如您已经注意到的,第一种解决此问题的方法是将引导程序的版本与代码的内部版本号或版本号绑定,以便版本的一部分始终在增加。这样引导程序总是知道删除以前安装的bundle exe。需要注意的是,引导程序应用程序确实考虑到版本的完整4部分,不像MSI放弃第4位数字。这是我在引导程序应用程序中实现的解决方案。

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

+1

即使他这样做(目前有一个讨论,以默认启用),MSI将展示类似的问题,而不升级版本。实际上,我为您的MSI添加了支持年份,以提取文件版本和捆绑包以提取产品版本: 您也可以更改MSI的升级表以允许相同版本的升级 - 这是测试相同版本的后续版本中的任何更改所必需的。 – Heath