How to select the version of the VC 2008 DLLs the application should be linked to?(如何选择应用程序应链接到的 VC 2008 DLL 的版本?)
问题描述
我正在使用 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).我想知道如何选择两个版本中的哪一个将被链接.有人知道吗?
I'm using Visual Studio 2008 SP1 for C++. When compiling, Visual Studio needs to choose against which version of the CRT and MFC DLLs the application should be linked, version 9.0.21022.8 (= RTM), 9.0.30729.17 (= SP1) or 9.0.30729.4148 (= SP1 with security update). I'd like to know how you can choose which of both versions will be linked against. Does anyone know?
注意:这在使用 私有程序集,因为您需要知道要与 .exe 一起复制哪些版本的 VC 9.0 DLL.
Note: this is important when using a private assembly, because you need to know which versions of the VC 9.0 DLLs to copy along with the .exe.
注意 _BIND_TO_CURRENT_VCLIBS_VERSION 标志仅确保清单中包含正确的版本.运行时的 DLL 版本选择显然不是基于清单文件中包含的版本.即使清单文件说应该使用 v21022,.exe 也会使用 v30729 .DLL.我知道这一点,因为它使用 v21022 中不存在的 std::tr1::weakptr.
Note that the _BIND_TO_CURRENT_VCLIBS_VERSION flag only makes sure that the right version is included in the manifest. The DLL version selection at runtime is apparently not done based upon the version that is included in the manifest file. Even if the manifest file says that v21022 should be used, the .exe uses the v30729 .DLLs. I know this, because it uses std::tr1::weakptr, which is not present in v21022.
推荐答案
_BIND_TO_CURRENT_VCLIBS_VERSION 设置清单中的当前版本 - 如果没有,则设置 RTM 版本.在清单中设置它是正确的方法.
_BIND_TO_CURRENT_VCLIBS_VERSION sets the current version in the manifest - or the RTM version if not. And setting it in the manifest is the correct way to do this.
但是,您看到的是程序集策略文件的效果:- 安装包含 2008 SP1 运行时的 VCRedist 包时,它会在 WinSxS 存储中安装一个策略文件,其中包含重定向尝试加载 RTM 的 bindingRedirect 条目运行时到 SP1 运行时.
What you are seeing however is the effects of an assembly policy file :- When the VCRedist package containing the 2008 SP1 runtime is installed, it installs a policy file into the WinSxS store with a bindingRedirect entry that redirects attempts to load the RTM runtime to the SP1 runtime.
因此,在其清单中指定 RTM 运行时的应用程序将加载 SP1 运行时,而指定 SP1 运行时的应用程序将加载 SP1 运行时.
So applications that specify the RTM runtime in their manifest will load the SP1 runtime, and applications that specify the SP1 runtime, will load the SP1 runtime.
如果您确实想使用 RTM 运行时,即使安装了 SP1 运行时和策略文件,您也需要在清单中指定 RTM 版本,并使用应用程序配置文件.基本上是yourappname.exe.config"(或yourdllname.dll.2.config",如果它是一个导致悲伤的隔离感知 dll).应用程序配置文件可以提供一个 bindingRedirect 元素,该元素覆盖清单或策略文件中指定的任何程序集版本.
If you actually DO want to use the RTM runtime, even when the SP1 runtime and policy files are installed, then you need to specify the RTM version in your manifest, AND make use of an application configuration file. Basically "yourappname.exe.config" ( or "yourdllname.dll.2.config" if its an isolation aware dll causing grief). Application congifuration files can supply a bindingRedirect element that overrides any assembly version specified in the manifest, or policy files.
即使安装了 SP1 运行时,此配置文件也会告诉操作系统加载 RTM 运行时:-
This config file will tell the OS to load the RTM runtime even if the SP1 runtime is installed :-
<?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"
Note: oldVersion is allowed to be a range: oldVersion="9.0.30729.1-9.1.0.0"
请参阅:应用程序配置文件记录在MSDN.
See: Application Configuration Files documented on MSDN.
这篇关于如何选择应用程序应链接到的 VC 2008 DLL 的版本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何选择应用程序应链接到的 VC 2008 DLL 的版本?
基础教程推荐
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01