- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用的是 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/
我是一名优秀的程序员,十分优秀!