WiX - VC++ 运行时 - vcredist vs 合并模块

Gun*_*nar 1 installation windows-installer wix vcredist

我正在使用 WiX 构建 MSI 安装程序。由于应该安装的产品需要 VC++ 运行时,我找到了两个选项:(a) 使用相应的合并模块和 (b) 在实际产品的 MSI 之前使用 Burn 运行 vcredist。为了区分这两个选项,我有一些我没有找到相关信息的问题。

1)如果使用合并模块,运行时不会单独安装(添加和删除程序中没有条目)但据我所知只是将所需的文件复制到相应的位置。

1.1) 如果系统上已经安装了 vcredist,我想合并模块在产品安装过程中什么都不做?

1.2) 如果存在 1.1) 中提到的 vcredist 安装,如果用户只是通过添加和删除程序卸载该运行时会发生什么?我想该产品不再工作(至少在执行修复安装之前会导致 MSI 中的合并模块内容重新添加必要的文件?)

1.3) 如果尚未安装 vcredist 并且 MSI 安装程序将文件复制到系统,然后另一个安装程序或用户正在调用 vcredist.exe 会发生什么?vcredist 是否报告运行时已安装?

1.4) 如果卸载产品,文件是否通过被删除的合并模块复制到系统中?

1.5) 如果对 1.4) 的回答是(删除了 VC++ 运行时文件):如果系统上安装了两个不同的产品,它们都在内部使用相同的合并模块,并且卸载了两个产品之一,则安装的运行时文件会发生什么? 由于缺少运行时文件,它们是否被删除并且其他产品不再工作?

在此先感谢您的帮助和信息。

问候, 贡纳尔

Phi*_*lDW 5

合并模块只是通过将文件包含在构建中来正确安装(通常共享)文件的一致方式。打个比方,C++ 编译器构建的 .obj 文件组合成一个 exe,但是在构建并运行 exe 之后,您不能再谈论 obj 具有单独的存在。合并模块也是如此。一旦它们进入 MSI,它们就只是要安装的文件,它们遵循标准规则。如果文件已安装(在共享位置),如果传入的版本高于已安装的版本,它将被覆盖。其包含的组件将被 ref 计数加一,并且使用该组件卸载其他产品(包括 VC redist)将 ref 计数向下,以便使用该文件的任何产品不会中断 - 仍然有一个版本可供他们使用。这只是产品之间共享文件的标准共享方法,一个产品是 VC redist,另一个是您的 MSI 没有区别。您的多个产品都可以很容易地使用合并模块安装文件,并且每个产品都可以卸载而不会破坏其他产品,因为引用计数以及共享位置和通用组件 ID 使共享按预期工作的事实。所以忘记一个产品是 VC redist 而另一个是你的(或另一个使用相同文件的产品)——这只是 Windows Installer 的共享文件/引用计数机制。您的多个产品都可以很容易地使用合并模块安装文件,并且每个产品都可以卸载而不会破坏其他产品,因为引用计数以及共享位置和通用组件 ID 使共享按预期工作的事实。所以忘记一个产品是 VC redist 而另一个是你的(或另一个使用相同文件的产品)——这只是 Windows Installer 的共享文件/引用计数机制。您的多个产品都可以很容易地使用合并模块安装文件,并且每个产品都可以卸载而不会破坏其他产品,因为引用计数以及共享位置和通用组件 ID 使共享按预期工作的事实。所以忘记一个产品是 VC redist 而另一个是你的(或另一个使用相同文件的产品)——这只是 Windows Installer 的共享文件/引用计数机制。

这是用于将文件安装到系统文件夹的最新合并模块。还有其他使用 WinSxS 的方案和现在似乎没有使用的策略重定向(VS 2015)。