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

Ada*_*gen 13 c++ deployment visual-c++

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

Zip*_*pyV 8

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

  • 我们也得出了这个结论 - 我们希望将SQL Server Express与我们的安装程序捆绑在一起,但是选择合并模块显然意味着MS提供的Service Pack安装程序无法安装Service Pack,而是我们必须为每个SP构建我们自己的升级.似乎不适合我们的情况. (2认同)

Jim*_*Jim 6

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

  • 像我这样的很多人仍会使用Google找到旧线程.所以它不是很老.FAQ说明线程(甚至是封闭的线程)"有资格改进".也许我应该使用评论而不是答案. (8认同)

小智 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版本的解决方案.


Sha*_*men 2

MSM 将为您提供比 vcredist 更好的简化体验,它将与进度条集成,并会在错误时回滚(或取消)。
从开发人员的角度来看,您将受益于在主安装日志文件中查看 msm 日志,它将与安装操作并行执行其操作(使用 vcredist 您需要自己对其进行排序)。

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