我应该使用vcredist.exe或msm来安装Visual C ++运行时库

时间:2009-07-27 19:10:00

标签: c++ visual-c++ deployment

使用vcredist.exe与msm文件安装Visual C ++ 8.0运行时库有什么优缺点?

6 个答案:

答案 0 :(得分:8)

合并模块一旦安装就无法更新(除非他们在Windows Installer中解决了),所以我的建议是坚持使用vcredist.exe。

答案 1 :(得分:6)

我最近碰到的合并模块的另一个问题是它们将MSI安装程序属性ALLUSERS设置为1,这意味着每台机器。这会强制您的整个安装是每台机器,如果您希望它是每个用户,这是一个问题。是否有一种方法可以让每个用户的安装程序包含一个我不知道的CRT合并模块,但我还没有找到它。

答案 2 :(得分:5)

合并模块的一个缺点是您无法在同一个msi中部署多个版本的VC80或VC90合并模块,因为文件标识符重叠。您可以部署其中一个。因此,例如,如果您想部署RTM版本的VC80和SP1版本,如果它们位于相同的msi(我使用WiX),您将收到错误。

另一个问题,构建行为在VS 2005/2008之间是不同的,因为它与应用Service Pack或更新有关。

2005 如果在构建计算机上安装Service Pack 1,程序将自动链接更新的文件。 Service Pack还将更新合并模块,因此如果您指示安装程序使用更新的文件,那么您没问题。但是,如果您使用的第三方编译的静态库可能需要特定的旧版运行时,这可能是一个问题。

2008 这里的行为恰恰相反。如果安装SP1,则合并模块将更新到SP1级别,但除非设置每个项目的预处理器宏,否则程序将针对RTM版本进行编译:_BIND_TO_VCLIBS_CURRENT_VERSION = 1。这可以在stdafx.h中或在项目的“Preprossor定义”中设置,或者如果您使用的是旧的nmake项目,则必须在命令行选项的任何位置传递它,例如CFLAGS。

这意味着如果您正在使用visual studio提供的msm,并且应用了SP1,则在您定义宏之前,项目部署将会中断。

对宏的另一个警告:如果您使用的是链接2008静态库的2005项目,那么设置宏将打破2005项目,因为2005版本的编译器中不存在该符号。在这种情况下,我通常将我链接的项目拆分为2005和2008版本的解决方案。

答案 3 :(得分:3)

要指出显而易见的,如果您不打算使用MSI安装程序,Merge Modules并不是一个很好的解决方案。无论您使用何种安装过程,Vcredist都非常简单易用。

答案 4 :(得分:2)

MSM将为您提供更好的流线型体验,然后是vcredist,它将与进度条集成并在出错时回滚(或取消)。
从开发人员方面,您将看到主安装日志文件中的msm日志,并通过安装操作并行执行其操作,您将受益(使用vcredist,您需要自己对其进行排序)。

由于上述所有原因,我通常选择使用msm(及其或多或少的一个Wix衬垫来使用它)。

答案 5 :(得分:0)

您是否考虑过静态链接?那你没有再分配问题。