我正在使用WiX构建MSI安装程序。由于应该安装的产品需要VC ++运行时,我找到了两个选项:(a)使用相应的合并模块和(b)在实际产品的MSI之前使用刻录来运行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 ++运行时文件被删除):如果系统上安装了两个不同的产品,两者都在内部使用相同的合并模块,并且两个产品中的一个被卸载会发生什么安装运行时文件?由于缺少运行时文件,它们是否被删除而另一个产品不再工作?
提前感谢您的帮助和信息。
此致 贡纳尔
答案 0 :(得分:4)
合并模块只是通过将它们包含在构建中来正确安装(通常是共享)文件的一致方法。作为类比,C ++编译器构建组合成exe的.obj文件,但是在构建和运行exe之后,你不能再讨论具有单独存在的obj。合并模块也是如此。一旦他们进入MSI,他们只是要安装的文件,他们遵循标准规则。如果已安装文件(在共享位置),如果传入版本高于已安装的版本,则将覆盖该文件。其中包含的组件将被重新计算一次,并且使用该组件卸载其他产品(包括VC redist)将重新计数,以便使用该文件的任何产品都不会中断 - 它们仍然有一个版本use。这只是产品之间共享文件的标准共享方法,一个产品是VC redist而另一个是你的MSI没有区别。您可以轻松地使用合并模块安装每个文件的几个产品,并且每个产品都可以卸载而不会因为重新计数而破坏其他产品,并且共享位置和公共组件ID使共享按预期工作。所以忘记一个产品是VC redist而另一个是你的(或者是另一个使用相同文件的产品) - 它只是Windows Installer的共享文件/引用计数机制。
这适用于最近将文件安装到系统文件夹的合并模块。还有其他使用WinSxS和政策重定向的方案,现在似乎没有使用(VS 2015)。