开发者社区> double2li> 正文

害人的VS2008,manifest导致“应用程序配置不正确,应用程序未能启动”

简介: 在VC++2008的项目中,如何显示地指定要使用的C++库的版本? 开发环境:VS2008 SP1 + Win2003 SP2         因为我的VS2008安装了SP1补丁,所以有了9.0.30729.1的MFC库文件(MFC90.DLL MSVCR90.DLL)。
+关注继续查看
在VC++2008的项目中,如何显示地指定要使用的C++库的版本? 

开发环境:VS2008 SP1 + Win2003 SP2 
        因为我的VS2008安装了SP1补丁,所以有了9.0.30729.1的MFC库文件(MFC90.DLL MSVCR90.DLL)。 


新建了一个MFC应用程序,编译为RELEASE版本,叫做“test1.exe”,可以从程序中的清单文件(manifest)看到以下内容: 
XML code

... <dependency>

<dependentAssembly>

<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'/>

</dependentAssembly>

</dependency>

<dependency>

<dependentAssembly>

<assemblyIdentity type='win32' name='Microsoft.VC90.MFC' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'/>

</dependentAssembly>

</dependency> ...



说明本程序需要引用版本号为9.0.21022.8的MFC库和运行时库。 

问题一:为什么程序在运行的时候,载入的不是9.0.21022.8版本的却是9.0.30729.1版本的运行库?这是在哪里进行设置的?如何改变这个版本号? 

问题二:(虽然貌似已经解决,但是我想知道的更深一点) 
布署的时候,把X:\VS安装目录\VC\redist下对应的运行库和.manifest文件(都是9.0.30729.1版本的)复制到与test1.exe同一目录下。在一台完全干净的新系统中,会出现“应用程序配置不正确,应用程序未能启动”的错误。 

后来,经过不断的试验,发现应用程序中的MANIFEST文件指定的是9.0.21022.8版本的运行库,然后我使用9.0.21022.8版本的Microsoft.VC90.CRT.manifest文件替换9.0.30729.1版本的Microsoft.VC90.CRT.manifest,配合上30729版本的MFC90.DLL,程序就可以正常运行了。 

简单一点,就是,对于一个使用了新版本DLL功能的应用程序,有以下情况: 
应用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了旧的版本号] + 新版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 不可以运行 
应用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了旧的版本号] + 旧版本的运行库MANIFEST文件 + 旧版本的运行库DLL --> 不可以运行 
应用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了旧的版本号] + 旧版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 可以运行 

注:运行库MANIFEST文件是指Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest,运行库DLL是指MSVCR90.DLL MFC90.DLL 

程序的清单文件不要内嵌,而使用外置的MANIFEST文件,然后手工把生成的text1.exe.manifest中的version='9.0.21022.8'改成新版本号version='9.0.30729.1' ,就可以达到以下目标了: 
应用程序 外置的MANIFEST文件[使用了使用了新版本DLL的功能 却指定了的版本号] + 新版本的运行库MANIFEST文件 + 新版本的运行库DLL --> 可以运行! 
(内嵌清单也是资源,当然可以修改,但是不建议这么做,而且也没必要这么做。)

终于终于,在微软网站找到了关于这个问题的描述。 
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=361682 
这的确是个BUG,具体什么时候会修复就不知道了。。。。。。。。 

所以,内嵌清单中的版本号只能为旧版本号,因此目前只能用,旧版本的运行库MANIFEST文件 + 新版本的运行库DLL ,才可以运行独立发布的程序了。。。

在VS2008中,“项目”-->“属性”-->“配置属性”-->“清单工具”-->“输入和输出”-->“嵌入清单”-->否。

这样程序编译后,假设是mytest.exe,将会产生一个mytest.exe.manifest,发布软件时最好附带上这个manifest文件,用记事本打开,可以看到对应MFC/CRT.manifest的版本。

在VS2008中,“项目”-->“属性”-->“配置属性”-->“清单工具”-->“输入和输出”-->“嵌入清单”-->是。mytest.exe将包含mytest.exe.manifest,不额外产生mytest.exe.manifest。

“配置属性”其它设置:(1)常规-->MFC的使用:在共享DLL中使用MFC;(2)C/C++  -->检查64位可一致性问题:否;(3)C/C++  -->代码生成-->运行时库:多线程调试DLL(/MDd);(4)链接器-->清单文件-->生成清单:是

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题
使用VS2008编译了一个程序,使用到自己编译的DLL,丢到某些机子上无法运行,提示“由于应用程序配置不正确,应用程序未能启动”的错误,装了vcredist_x86也没有用,开始以为是DLL的问题,后来换个简单的程序,仍然不行,百撕不得其解,后来上网找,下面有说了很多解决办法。
1498 0
WIN 10 IIS 服务或万维网发布服务,或者依赖这两种服务的某个服务未能启动。该服务或所依赖的服务可能在启动期间发生错误或者已禁用。
环境:win10 企业版今天重启iis的时候报出了下面的错误: 即:IIS 服务或万维网发布服务,或者依赖这两种服务的某个服务未能启动。该服务或所依赖的服务可能在启动期间发生错误或者已禁用。在网络上搜索解决方案,比如: 即:点击打开链接 这三个服务我也禁止了: 上面的方案我在win7下操作成功了(之前win7下也遇到过这个问题),但在win 10下没有效果。 于是查看系统日志: 具体信息
1630 0
loadlibrary(xxx.dll) 失败 返回14001 由于应用程序配置不正确 应用程序未能启动.重新安装应用程序可能会纠正这个问 .
欢迎大家拍砖! 一、应用背景 有一个在win7中用VS2008编译成功,运行正常的程序:Exe+DLL; 放到XP虚拟镜像上运行却提示:LoadLibrary返回14001。 (1) 后来采用了下面方法中的“方法一”解决了。
1344 0
“/”应用程序中的服务器错误。
解决方法:因为引起这个错误的原因很多,最好在服务器端访问站点,(如果条件不具备,就只能按提示修改web.config文件),查看出错提示,按提示 修改设置。这一次引起这个错误的原因是我误加了一个HttpModule,在web.config删除掉误增加的HttpModule设置,问题解决。
900 0
iis7应用程序池经常自动停止如何解决?
提示与application通信错误 目前根据 计算机配置中 iis的相关服务为手动启动改为自动启动,等待查看效果如何
855 0
+关注
double2li
一个在IT行业摸爬滚打的老司机
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android应用启动速度和内存优化实践
立即下载
Android应用-启动速度和内存优化实践
立即下载
低代码开发师(初级)实战教程
立即下载