windows - 防止多次安装

标签 windows wix windows-installer

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

执行文件:

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

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

最佳答案

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

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

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

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

关于windows - 防止多次安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36878201/

相关文章:

wix - 如何在 WiX 中创建非 "Repair"的补丁

assemblies - 如何卸载 Win32 程序集并清理 WinSxS?

windows - 命令行 - 如何仅在使用 for 命令循环时提取文件名

c# - 如何创建 "custom protocol"并将其映射到应用程序?

c - 转义序列\a 不起作用

com - 如何在插件体系结构中进行免注册的COM

wix 意外的子元素 'Website'

C++ 创建 LPWSTR 的简单数组

windows-installer - 如何通过电子生成器参数化MSI文件

installation - 当MSI在卸载过程中失败时,是否有 "best"方法可以强制 "uninstall"产品?