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

WiX - VC++ Runtime - vcredist vs merge module

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

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

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

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

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

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

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

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

此致, 贡纳尔

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

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