【问题标题】:How to select the version of the VC 2008 DLLs the application should be linked to?如何选择应用程序应链接到的 VC 2008 DLL 的版本?
【发布时间】:2011-01-18 09:02:12
【问题描述】:

我正在使用 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。我知道这一点,因为它使用 v21022 中不存在的 std::tr1::weakptr。

【问题讨论】:

  • 请注意:Visual Studio 2008 SP1 是 9.0.30729.1
  • @Simon:你是对的!我更新了我的问题。

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


【解决方案1】:

编译器使用 .h 和 .lib 文件来确定要使用的 CRT 代码。更改项目的包含和 lib 搜索目录构建设置,以查看存在相应 .lib 和 .h 文件的目录。

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

【讨论】:

    【解决方案2】:

    通过定义

    #define _CRT_ASSEMBLY_VERSION "9.0.30729.1"
    

    #define _MFC_ASSEMBLY_VERSION "9.0.30729.1"
    

    您可以链接到指定的版本。

    【讨论】:

    • 或者简单地将 _BIND_TO_CURRENT_CRT_VERSION 定义为 1(= 最新版本)或 0(= 最旧版本)。对吗?
    • 是的,没错。但是如果你想绑定一个指定的版本,请使用上面的定义。我得到的情况是我必须绑定到 9.0.30729.1 但 _BIND... 到最新的将是 9.0.30729.4148,所以我必须使用该定义。
    【解决方案3】:

    _BIND_TO_CURRENT_VCLIBS_VERSION 设置清单中的当前版本 - 如果不是,则设置 RTM 版本。 在清单中设置它是正确的方法。

    但是,您看到的是程序集策略文件的效果:- 安装包含 2008 SP1 运行时的 VCRedist 包时,它会在 WinSxS 存储中安装一个策略文件,其中包含重定向尝试加载 RTM 的 bindingRedirect 条目运行时到 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"

    请参阅:Application Configuration Files 记录在 MSDN 上。

    【讨论】:

    • 非常感谢您的解释。这确实解释了我注意到的奇怪行为。
    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多