如何select应用程序应链接到的VC 2008 DLL的版本?

我正在使用C ++的Visual Studio 2008 SP1。 编译时,Visual Studio需要select与应用程序链接的版本的CRT和MFC DLL,版本9.0.21022.8(= RTM),9.0.30729.17(= SP1)或9.0.30729.4148(=安全更新的SP1) 。 我想知道如何select哪个版本将链接。 有人知道吗?

注意 :使用私有程序集时 ,这一点很重要,因为您需要知道要将哪些版本的VC 9.0 DLL与.exe一起复制。

请注意 ,_BIND_TO_CURRENT_VCLIBS_VERSION标志只能确保清单中包含正确的版本。 运行时的DLL版本select显然不是基于清单文件中包含的版本来完成的。 即使清单文件说应该使用v21022,.exe也使用v30729 .DLL。 我知道这一点,因为它使用std :: tr1 :: weakptr,这是不存在于v21022。

_BIND_TO_CURRENT_VCLIBS_VERSION设置清单中的当前版本 – 如果没有则设置RTM版本。 并将其设置在清单中是正确的方法。

但是,您所看到的是装配策略文件的效果: – 安装了包含2008 SP1运行时的VCRedist软件包时,它会使用一个bindingRedirect条目将安全策略文件安装到WinSxS存储中,该条目将重定向尝试将RTM运行时加载到SP1运行时。

因此,在清单中指定RTM运行时的应用程序将加载SP1运行时,并且指定SP1运行时的应用程序将加载SP1运行时。

如果实际上想要使用RTM运行时,即使安装了SP1运行时和策略文件,也需要在清单中指定RTM版本,并使用应用程序配置文件。 基本上“yourappname.exe.config”(或“yourdllname.dll.2.config”,如果它的隔离感知DLL导致悲伤)。 应用程序配置文件可以提供一个覆盖清单中指定的任何程序集版本或策略文件的bindingRedirect元素。

即使安装了SP1运行时,此配置文件也会告诉操作系统加载RTM运行时: –

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <configuration> <windows> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/> <bindingRedirect oldVersion="9.0.30729.1" newVersion="9.0.21022.8"/> </dependentAssembly> </assemblyBinding> </windows> </configuration> 

注意:允许oldVersion是一个范围: oldVersion="9.0.30729.1-9.1.0.0"

请参阅:在MSDN上记录的应用程序配置文件 。

通过定义

 #define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

要么

 #define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

你可以链接指定的版本。

编译器使用.h和.lib文件来确定要使用的CRT代码。 更改您的项目的包含和lib搜索目录生成设置,以查找适当的.lib和.h文件存在的目录。

这就是说,你为什么觉得有必要使用除最新的CRT之外的任何东西?