我正在使用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++运行时文件):如果系统上安装了两个不同的产品,它们都在内部使用相同的合并模块,并且两个产品中的一个已经卸载,那么所安装的运行时文件会发生什么情况?由于缺少运行时文件,它们是否被删除,而另一个产品不再工作?
提前感谢您的帮助和信息。
你好,加纳
发布于 2016-05-12 23:55:41
合并模块只是通过将文件包含在构建中来正确安装(通常是共享的)文件的一致方法。作为一个类推,C++编译器构建.obj文件,这些文件被组合成一个exe,但是在构建和运行该exe之后,您就不能再谈论obj有一个单独的存在了。合并模块也是如此。一旦它们在MSI中,它们就是要安装的文件,并且遵循标准规则。如果文件已经安装(在共享位置),如果传入的版本高于已经安装的版本,它将被覆盖。其包含的组件将由一个人来计算,使用该组件卸载其他产品(包括VC redist)将减少引用,这样使用该文件的任何产品都不会中断--对于use.This来说,仍然有一个版本是产品之间共享文件的标准共享方法,一个产品是一个VC redist,另一个是您的MSI。同样容易的是,您的几个产品都使用merge模块安装文件,并且每个产品都可以在不中断其他组件的情况下卸载,因为ref计数以及共享位置和公共组件ID使共享工作如愿以偿这一事实。因此,忘记一个产品是VC redist,另一个是您的(或另一个使用相同文件)-这都只是Windows安装程序的共享文件/参考计数机制。
这是针对最近将文件安装到系统文件夹的合并模块。使用WinSxS和策略重定向的其他方案现在似乎没有被使用(VS 2015)。
https://stackoverflow.com/questions/37191861
复制相似问题