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

标签 c++ windows visual-studio-2008 dll dependencies

我使用的是 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 标志仅确保正确的版本包含在 list 中。运行时的 DLL 版本选择显然不是根据 list 文件中包含的版本完成的。即使 list 文件表明应使用 v21022,.exe 也会使用 v30729 .DLL。我知道这一点,因为它使用了 std::tr1::weakptr,它在 v21022 中不存在。

最佳答案

_BIND_TO_CURRENT_VCLIBS_VERSION 设置 list 中的当前版本 - 如果不是,则为 RTM 版本。 在 list 中设置它是执行此操作的正确方法。

然而,您看到的是程序集策略文件的效果:- 安装包含 2008 SP1 运行时的 VCRedist 程序包时,它会将策略文件安装到 WinSxS 存储中,其中包含重定向尝试加载 RTM 的 bindingRedirect 条目运行时到 SP1 运行时。

因此,在其 list 中指定 RTM 运行时的应用程序将加载 SP1 运行时,而指定 SP1 运行时的应用程序将加载 SP1 运行时。

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

即使安装了 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"

参见:Application Configuration Files记录在 MSDN 上。

关于c++ - 如何选择应用程序应链接到的 VC 2008 DLL 的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2289593/

相关文章:

c++ - 在 NS-3 中使用 Ramdomwaypoint 模型时如何设置位置分配器

php - 在 XAMPP for Windows 中升级 PHP 5.4.0?

c# - 如何在从组合框中选择任何值时连接到数据库

c# - 是否可以使用 VS2008 在 C# 中自动连接事件?

c++ - Hippomock 中 Expect 调用函数参数中的模板函数

c++ - C++ 中::运算符的规则

c++ - 模板特化和 enable_if 问题

c# - 如何在 while 循环中声明公共(public)字符串 (C#)

c++ - Windows/C++ : why are loaded module memory bytes changing at run-time?

c# - Visual Studio 2008 不断将输出目录设置为相对路径