C++ 如何选择应用程序应链接到的VC 2008 DLL的版本?

C++ 如何选择应用程序应链接到的VC 2008 DLL的版本?,c++,windows,visual-studio-2008,dll,dependencies,C++,Windows,Visual Studio 2008,Dll,Dependencies,我使用VisualStudio 2008 SP1作为C++。编译时,Visual Studio需要选择应用程序应链接的CRT和MFC DLL的哪个版本,版本9.0.21022.8(=RTM)、版本9.0.30729.17(=SP1)或版本9.0.30729.4148(=具有安全更新的SP1)。我想知道您如何选择这两个版本中的哪一个将被链接。有人知道吗 注意:这在使用时很重要,因为您需要知道要将哪些版本的VC 9.0 DLL与.exe一起复制 请注意,_BIND_TO_CURRENT_VCLIBS

我使用VisualStudio 2008 SP1作为C++。编译时,Visual Studio需要选择应用程序应链接的CRT和MFC DLL的哪个版本,版本9.0.21022.8(=RTM)、版本9.0.30729.17(=SP1)或版本9.0.30729.4148(=具有安全更新的SP1)。我想知道您如何选择这两个版本中的哪一个将被链接。有人知道吗

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


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

编译器使用.h和.lib文件来确定要使用的CRT代码。更改项目的include和lib搜索目录生成设置,以查找相应的.lib和.h文件所在的目录

也就是说,为什么您觉得除了最新的CRT之外,还需要使用其他任何东西呢

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1"


您可以针对指定的版本进行链接。

\u BIND\u TO\u CURRENT\u VCLIBS\u 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元素,该元素覆盖清单或策略文件中指定的任何程序集版本

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

<?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>


记录在MSDN上。

或简单地将“绑定到当前”CRT版本定义为1(=最新版本)或0(=最旧版本)。对吗?对,对。但是,如果要绑定指定的版本,请使用上面的define。我得到的情况是,我必须绑定到9.0.30729.1,但是_bind。。。最新版本是9.0.30729.4148,所以我不得不使用这个定义。1@Simon你说得对!我更新了我的问题。非常感谢你的解释。这确实解释了我注意到的奇怪行为。
<?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>