1

我正在使用 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++ 运行时文件被删除):如果系统上安装了两个不同的产品,两者都在内部使用相同的合并模块,并且卸载了两个产品中的一个,那么安装的运行时文件会发生什么情况? 由于缺少运行时文件,它们是否被删除并且其他产品不再工作?

提前感谢您的帮助和信息。

问候,贡纳尔

4

1 回答 1

5

合并模块只是通过将它们包含在构建中来正确安装(通常是共享)文件的一致方式。打个比方,C++ 编译器构建 .obj 文件,这些文件组合成一个 exe,但你不能再谈论一个 obj 在构建并运行 exe 后具有单独的存在。合并模块也是如此。一旦它们进入 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)。

于 2016-05-12T23:55:41.713 回答