害人的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)链接器-->清单文件-->生成清单:是

目录
相关文章
|
C# Windows 容器
WPF技术之CheckBox控件
WPF(Windows Presentation Foundation)的CheckBox控件用于表示一个可以选中或取消选中的复选框。
1143 0
|
JavaScript 前端开发 应用服务中间件
【超详细!】vue+koa+nginx前后端分离开发项目上线部署到云服务器
1、项目介绍 本项目是vue+koa前后端分离开发的手机商城项目,先贴一下项目的目录,我们主要就是要部署dist和server这两个文件夹
1245 0
【超详细!】vue+koa+nginx前后端分离开发项目上线部署到云服务器
|
Java 应用服务中间件 Android开发
无法解析javax.servlet的解决方法
无法解析javax.servlet的解决方法
4908 0
无法解析javax.servlet的解决方法
|
网络协议 Linux 网络安全
|
10月前
|
JavaScript 前端开发 数据安全/隐私保护
Web开发者必看:手把手教你如何轻松播放m3u8流地址,解锁视频播放新技能,让你的项目更上一层楼!
【10月更文挑战第23天】随着互联网技术的发展,m3u8格式因良好的兼容性和高压缩率被广泛用于网络流媒体传输。本文介绍如何在Web端播放m3u8流地址,包括引入视频播放器(如Video.js)、创建播放器容器、初始化播放器及播放m3u8流的具体步骤。此外,还涉及处理加密m3u8流的示例。
2112 1
|
安全 Unix Shell
web安全之命令执行
应用未对用户输入做严格得检查过滤,导致用户输入得参数被当成命令来执行。
156 4
|
弹性计算 Linux 测试技术
带你读《弹性计算技术指导及场景应用》——1. 单实例上运行Linux桌面多开解决方案(2)
带你读《弹性计算技术指导及场景应用》——1. 单实例上运行Linux桌面多开解决方案(2)
405 0
|
Linux
linux查看是否开启超线程
我们知道intel的cpu拥有超线程技术,可以为一个逻辑核心开启两个处理线程。通过查看物理CPU数,每个CPU的逻辑核数,CPU线程数可以得知是否开启了超线程。 物理CPU数 [root@localhost daxiang]# cat /proc/cpuinfo | grep "physica...
4568 0
|
存储 机器学习/深度学习 JSON
【安全】如果您的JWT被盗,会发生什么?
【安全】如果您的JWT被盗,会发生什么?
|
编译器 Linux Windows
优化求解器之AMPL建模工具简介
在使用优化求解器解决实际问题的过程中,通过程序接口输入优化模型往往会耗费大量时间和精力,且容易出错。为了简化这一步骤,建模语言应运而生。建模语言最初的概念是在1976年提出的,后经过不断的发展,形成了如今蓬勃的技术、产品和应用市场。建模语言往往并不对实际问题进行求解,而专注在模型建立本身,其目的是将复杂的优化问题简化为抽象的代数表达形式;让用户在开发上只需要专注于代数模型的建立,模型完成后再将数据分别引入。如此不但加快开发流程,更有效减少模型输入错误的可能性。接下来我们将发布一系列文章,对常见的AMPL, Pyomo, PuLP等建模语言进行简要的介绍。
优化求解器之AMPL建模工具简介