介绍

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之后,又被集成到模块当中去了,不再分开提供。

Madifest文件详解的更多相关文章

  1. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  2. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

  3. SUBLIME TEXT 2 设置文件详解

    SUBLIME TEXT 2 设置文件详解 Preferences.sublime-settings文件: // While you can edit this file, it’s best to ...

  4. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  5. delphi 资源文件详解

    delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...

  6. VSFTPD全攻略(/etc/vsftpd/vsftpd.conf文件详解)

    /etc/vsftpd/vsftpd.conf文件详解,分好类,方便大家查找与学习 #################匿名权限控制############### anonymous_enable=YE ...

  7. jni.h头文件详解二

    作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...

  8. 【转】 jni.h头文件详解(二)

    原文网址:http://blog.csdn.net/shaohuazuo/article/details/42932813 作者:左少华 博客:http://blog.csdn.net/shaohua ...

  9. Android.mk文件详解(转)

    源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...

随机推荐

  1. (简单) ZOJ 3209 Treasure Map , DLX+精确覆盖。

    Description Your boss once had got many copies of a treasure map. Unfortunately, all the copies are ...

  2. Seajs是什么及其优缺点&如何使用?

    这篇文章主要介绍了Seajs的相关知识和和学习心得,适合刚接触SeaJS的同学,需要的朋友可以参考下,有更好的新手教程或文档,欢迎推荐.分享! 1.Seajs简介   Seajs,一个Web模块加载框 ...

  3. BZOJ 1106: [POI2007]立方体大作战tet

    1106: [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 682  Solved: 496[Submit][St ...

  4. MySQL的IP处理函数inet_aton()和inet_ntoa()

    给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> SELECT inet_aton ...

  5. kvm下Windows激活方式小计

    使用kvm创建widnwos镜像模板,镜像模板默认是已经激活的正版系统,但是使用程序拷贝部署到不同的机器后发现已经激活的系统变成未激活状态,我们需求就是需要拷贝到不同的机器也能显示是正版系统 网上找了 ...

  6. 简单的cd命令

    cd ~ :进入home目录 cd   :进入home目录 cd - :进入上一个目录 cd /home/venn : 进入指定目录 当然,我想说的是cd(不加任何路径),进入home目录

  7. PHP 一致性哈希算法的一种简单实现

    在分布式系统中,如果某业务可以由多个相同的节点处理,很容易想到用HASH的方式将业务请求分散到这些节点处理,比如memecache缓存等分 布式集群应用,如果只是简单的使用,不涉及用户用户状态等信息, ...

  8. 2.12. 后端 SQL 的可见性(Core Data 应用程序实践指南)

    上一节已经插入了数据,非常好.但是,我得更进一步.要知道里面究竟发生了什么,持久化存储区的数据有什么变化,生成了哪些查询语句.每次运行程序时,是否重复插入了对象. 有一个调试选项可以提供足够的信息,开 ...

  9. 【HDU 5808】 Price List Strike Back (整体二分+动态规划)

    Price List Strike Back There are nn shops numbered with successive integers from 11 to nn in Bytelan ...

  10. 关于android:id="@+id/xx"的理解

    之前学习android的时候,对android:id="@+id/xx"总感觉混淆,不理解,刚看了一篇文章.现在貌似是恍然大悟.故做了一下笔记,希望帮助有共同问题的人... and ...