使用vcredist.exe与msm文件安装Visual C++ 8.0运行时库有什么优缺点?
合并模块一旦安装就无法更新(除非他们在Windows Installer中解决了),所以我的建议是坚持使用vcredist.exe.
我最近碰到的合并模块的另一个问题是它们将MSI安装程序属性ALLUSERS设置为1,这意味着每台机器.这会强制您的整个安装是每台机器,如果您希望它是每个用户,这是一个问题.是否有一种方法可以让每个用户安装程序包含一个我不知道的CRT合并模块,但我还没有找到它.
合并模块的一个缺点是您无法在同一个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版本的解决方案.