我正在使用Visual Studio 2008 SP1 for C ++。编译时,Visual Studio需要选择应该链接应用程序的哪个版本的CRT和MFC DLL,版本9.0.21022.8(= RTM),9.0。30729.17(= SP1)或9.0.30729.4148(=带安全更新的SP1) 。我想知道如何选择将两个版本中的哪个版本链接起来。有谁知道吗?
注意:使用private assembly时这很重要,因为您需要知道要与.exe一起复制哪些版本的VC 9.0 DLL。
注意 _BIND_TO_CURRENT_VCLIBS_VERSION标志只确保清单中包含正确的版本。运行时的DLL版本选择显然不是基于清单文件中包含的版本完成的。即使清单文件说应该使用v21022,.exe也会使用v30729 .DLL。我知道这一点,因为它使用std :: tr1 :: weakptr,这在v21022中不存在。
答案 0 :(得分:9)
_BIND_TO_CURRENT_VCLIBS_VERSION设置清单中的当前版本 - 如果不是,则设置RTM版本。 在清单中设置它是正确的方法。
然而,您看到的是程序集策略文件的影响: - 安装了包含2008 SP1运行时的VCRedist程序包时,它会将策略文件安装到WinSxS存储中,并带有bindingRedirect条目,该条目重定向尝试加载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上记录的Application Configuration Files。
答案 1 :(得分:3)
通过定义
#define _CRT_ASSEMBLY_VERSION "9.0.30729.1"
或
#define _MFC_ASSEMBLY_VERSION "9.0.30729.1"
您可以链接指定的版本。
答案 2 :(得分:0)
编译器使用.h和.lib文件来确定要使用的CRT代码。更改项目的include和lib搜索目录构建设置,以查找存在相应.lib和.h文件的目录。
那就是说,为什么你觉得除了最新的CRT之外还需要使用其他东西?