应用程序无法与VS 2008 SP1 DLL一起运行,早期版本可与RTM版本一起使用
自从Visual Studio 6切换到Visual Studio 2008以来,我们一直在私有并行配置中使用MFC90.dll和msvc [pr] 90.dll以及清单文件,以免担心版本或者将它们安装到系统上。
SP1之前的版本运行良好(并且在我们的开发人员机器上仍然运行良好)。现在我们已经在SP1之后进行了一些测试,自从昨天早上以来,我一直在拔头发。
首先,我们的NSIS安装程序脚本从redist文件夹中提取dll和清单文件。这些不再正确,因为该应用程序仍链接到RTM版本。
因此,我将_BIND_TO_CURRENT_VCLIBS_VERSION = 1的定义添加到我们的所有项目中,以便它们将使用redist文件夹中的SP1 DLL(或者在出现新Service Pack时使用其后的SP1 DLL)。我花了几个小时才找到它。
我仔细检查了编译中中间文件文件夹中生成的清单文件,它们正确列出了9.0.30729.1 SP1版本。我已经进行了两次和三次检查,这取决于一台干净的机器:它都链接到本地dll,没有任何错误。
运行该应用程序仍会出现以下错误:
The application failed to initialize properly (0xc0150002). Click on OK to terminate the application.
我在google或者microsoft上进行的所有搜索都没有涉及到与我的特定问题有关的任何信息(但此错误消息可追溯到2005年)。
有人对SP1有任何类似的问题吗?
- (B)该.exe的资源部分中嵌入的清单文件的版本。默认情况下,此清单文件由Visual Studio自动生成。
- (C)我们在与.exe相同的目录中复制的VC .DLL(并行程序集的一部分)的版本。
为了清楚起见,我将使用v1 / v2表示法。下表显示了许多可能的情况:
c:\Program Files\...\...\X.exe This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.
在干净的Vista SP1安装上运行.exe时,这些情况的结果是:
- (D)我们复制到与.exe相同目录中的VC清单文件的版本(并行程序集的一部分)。
- v1:9.0.21022.8
- v2:9.0.30729.4148
- 情况1:显示一个弹出窗口,说:"过程入口点XYZXYZ不能位于动态链接库中"。
现在,我的情况(我认为与crashmstr相同)是nr1. 问题是Visual Studio出于某种原因为v2生成了客户端代码(A),但是出于某种原因却生成了v1清单文件(B)。我不知道可以在哪里配置版本(A)。
注意,整个解释仍在私有程序集的上下文中。
更新:最后,我开始了解发生了什么。显然,Visual Studio默认情况下会为v2生成客户端代码(A),这与我在某些Microsoft博客上所读的内容相反。 _BIND_TO_CURRENT_VCLIBS_VERSION标志仅选择生成的清单文件(B)中的版本,但是在运行应用程序时将忽略此版本。
总结
默认情况下,Visual Studio 2008编译的.exe链接到VC90 DLL的最新版本。我们可以使用_BIND_TO_CURRENT_VCLIBS_VERSION标志来控制清单文件中将生成哪个版本的VC90库。这确实避免了出现错误消息"清单与请求的组件的标识不匹配"的情况2. 它还说明了情况3为何工作正常,因为即使没有_BIND_TO_CURRENT_VCLIBS_VERSION标志,该应用程序也已链接到VC DLL的最新版本。
对于运行vcredist的公共并排程序集,情况甚至更奇怪了,将VC 9.0 DLL放在Windows SxS目录中。即使.exe的清单文件指出应使用DLL的旧版本(在未设置_BIND_TO_CURRENT_VCLIBS_VERSION标志的情况下,也是如此),Windows默认情况下会忽略此版本号!而是,如果使用系统上的Windows,则将使用较新的版本,除非使用"应用程序配置文件"。
我是唯一认为这令人困惑的人吗?
因此,总而言之:
- 情况2:运行.exe时似乎什么也没发生,但是Windows"事件查看器/应用程序日志"中记录了以下事件:激活上下文生成失败,原因是" C:\ Path \ file.exe"。清单或者错误第4行上的策略文件" C:\ Path \ Microsoft.VC90.CRT.MANIFEST"。清单中找到的组件标识与请求的组件的标识不匹配。参考是Microsoft.VC90.CRT,processorArchitecture =" x86",publicKeyToken =" 1fc8b3b9a1e18e3b",type =" win32",version =" 9.0.21022.8"。定义是微软
- 情况3:一切似乎都正常。这是remicles2的解决方案。
列表数量不匹配
列表数量不匹配
列表数量不匹配
代码数量不匹配
代码数量不匹配
代码数量不匹配