Madifest文件详解
介绍
Madifest是个XML的描述文件,对于每个DLL有DLL的Manifest文件,对于每个应用程序Application也有自己的Manifest。对于应用程序而言,Manifest可以是一个和exe文件同一目录下的.manifest文件,也可以是作为一个资源嵌入在exe文件内部的(Embed Manifest)。
XP以前版本的windows,会像以前那样执行这个exe文件,寻找相应的dll,没有分别Manifest只是个多余的文件或资源,dll文件会直接到system32的目录下查找,并且调用。这样,如果公共DLL升级,将会导致之前安装的应用程序不能使用,这就是“DLL Hell”的来源。为了解决这个问题,.NET开发提出了side-by-by的开发方法,来避免这个问题。主要方法,就是通过Manifest文件来查找相应的DLL。XP及以后的系统都集成了这样一种查找DLL的方法。
提取Manifest
默认Manifest文件都是内嵌在exe/dll中的,如果需要查看。VS提供mt.exe工具来从exe/dll中提取Manifest文件。
mt.exe -inputresource:d:\test.exe -out:d:\test.manifest
的Manifest文件有关设置
我们编译MFC工程时,会在stdafx.h文件里看到下列代码。
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
如果是非unicode版本,则生成的界面是Win98风格,如果是unicdoe版本,则是当前操作系统的风格。 Linker→Manifest file→Generate Manifest→yes 即会生成EXE/DLL所用的Manifest文件。
< ?xml version='1.0' encoding='UTF-8' standalone='yes'?>
< assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
< dependency>
< dependentAssembly>
< assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
< /dependentAssembly>
< /dependency>
< dependency>
< dependentAssembly>
< assemblyIdentity type='win32' name='Microsoft.VC80.MFC' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
< /dependentAssembly>
< /dependency>
< dependency>
< dependentAssembly>
< assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
< /dependentAssembly>
< /dependency>
< /assembly>
如果没有设置上面的控件风格,则生成的Manifest不会包括contrls.
< ?xml version='1.0' encoding='UTF-8' standalone='yes'?>
< assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
< dependency>
< dependentAssembly>
< assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
< /dependentAssembly>
< /dependency>
< dependency>
< dependentAssembly>
< assemblyIdentity type='win32' name='Microsoft.VC80.MFC' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
< /dependentAssembly>
< /dependency>
< /assembly>
所有的exe/dllFT都必须要有Manifest。如果Linker→Manifest file→Generate Manifest→No,则在必须Manifest Tool→Additinal Manifest Files中指定相应的Manifest文件。 Manifest Tool→Embed Manifest→Yes。一般都是将Manifest文件嵌套在程序中。也可以不嵌套在程序中,像MFCxx.dll, MSVCRxx.Dll,MSVCPxx.dll都是没有将Manifest嵌套在程序中的。所以当使用它们时必须与其Manifest文件一起使用。
EXE调用DLL的过程
以下针对链接MFCxx.dll, MSVCPXX.DLL, MSVCRxx.dll的程序。
系统启动exe时,会先检查其Manifest文件(如果没有查找到当前EXE中有Manifest,则会报“程序配置不正确的”的错误提示),查找系统中是否有注册相应的Dll组件。如果有,则会去c:\windows\winsxs\Manifest文件夹根据相应的调用策略及Manifest文件,然后再根据Manifest中的内容去c:\windows\winsxs同名文件夹中查找到关的DLL。
如果没有查找到相应的DLL,则会到当前目录来查找Microsoft.VC80.CRT.manifest和Microsoft.VC80.MFC.manifest。
如果没有查找到当前EXE中有Manifest,则会报“程序配置不正确的”的错误提示。查到之后,就会去找相应的DLL。然后执行程序。
相关DLL介绍
选择Use MFC in share DLL会用到MFCxx.DLL. MFC80.dll, 即对应VS2005的。 MFC80U.DLL,即对应VS2005的Unicode版本。
选择MD/MDd则会用到下面的DLL。 MSVCR80.dll,即VS2005下的C RunTime库,提供基本的C函数。 MSVCP80.dll, 即VS2005年的C++函数库,如果有调用<string>之类的文件,则会使用到此DLL。
注意
1、X86、X64需要去VS工具目录
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64
2、Manifest文件自VS2010之后,又被集成到模块当中去了,不再分开提供。
最新文章
- 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互
- Maven基础知识(转)
- Ubuntu下如何将普通用户提升到root权限
- OpenCV 简介
- HDU 4462
- android L 新控件侧滑菜单DrawerLayout 使用教程
- Object-C 内存管理及对象
- Can&#39;t locate ExtUtils/MakeMaker.pm
- [解决]Kali Linux DHCP自动获取IP失败 坑爹的VMWare桥接
- WinServer 之 发布WebService后调用出现"; The test form is only available for requests from the local machine. ";
- Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
- 关于ArcGIS Rest API
- Objective-C基础笔记(2)@property和@synthesize
- web服务器配置方法
- 对象之function
- /proc/kcore失效,调试其文件系统相关模块,使重新正常工作
- 强大又简单的响应式框架——Foundation 网格系统
- python的切片
- Ubuntu 14.04 LTS 系统空间不足,输入密码后,无法进入桌面的解决办法
- [Android]Android布局优化之 merge
热门文章
- iOS之Nib和Xib以及storyboard(故事版)
- (译)Windsor入门教程---第一部分 获取Windsor
- mac android studio 更新sdk的解决方案
- AWK第一篇------全面介绍
- CodeForces 652B z-sort
- CodeForces 626D Jerry&#39;s Protest
- MySQL show status命令参数
- 10天学会phpWeChat——第八天:Form类,丰富表单提交的字段类型
- iOS开源库--最全的整理 分类: ios相关 2015-04-08 09:20 486人阅读 评论(0) 收藏
- IOS开发-UI学习-UIWebView,简单浏览器的制作