Manifest文件详解

article/2025/10/27 0:24:55

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


http://chatgpt.dhexx.cn/article/S2vSX7Ql.shtml

相关文章

AndroidManifest文件详解

AndroidManifest 官方解释是应用清单&#xff08;Manifest意思是货单&#xff09;&#xff0c;每个应用的根目录中都必须包含一个&#xff0c;并且文件名必须为AndroidManifest。这个文件中包含了APP的配置信息&#xff0c;系统需要根据里面的内容运行APP的代码&#xff0c;显示…

IIS 部署的网站无法启动

昨天更新了下电脑系统&#xff0c;早上一来发现自己原先在iis上部署的网站全部都被停止了。。。。。。。然后找其中一个网站进行重新启动&#xff0c;却是无法启动&#xff0c;提示如图&#xff1a; 这个是因为80端口被占用了&#xff0c;可以在 命令行 输入 netstst -ano …

如何打开IIS服务

windows10为例&#xff1a;右击此电脑--属性--控制面板--网络和Internet--程序--启用或关闭Windows功能--勾选Internet Information Services 所有选项--确定&#xff0c;等待操作完成后&#xff0c;就可以打开IIS服务了&#xff08;使用时直接搜索IIS即可&#xff09; 详细步…

Windows Server 2016 IIS无法启用W3SVC或IIS应用池状态未知服务无法启动

起因&#xff1a; 近期给客户部署系统&#xff0c;由于安装环境&#xff08;C、.net、dotnet&#xff09;出现了操作系统&#xff08;Windows Server 2016 Standard&#xff09;无法开机的情况。然后用PE修复系统之后&#xff0c;通过安全模式下&#xff0c;最后一次正确配置&a…

IIS因为World Wide Web Publishing Service无法启动 1068

IIS无法启动&#xff0c;报错&#xff1a; 然后在服务管理窗口中&#xff0c;找到World Wide Web Publishing Service 并启动。 如果World Wide Web Publishing Service 无法启动&#xff0c;右键属性查看依赖项&#xff0c;把依赖项都启动&#xff0c;再次启动World Wide Web …

iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425)

问题描述&#xff1a;每隔一段时间应用程序池就会自动停止。 再次启动就报错&#xff1a;服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425) 处理办法&#xff1a;同时按下WinR,运行“services.msc”,进入服务管理&#xff0c; 里面有个“Credential Manager”,设…

IIS6/IIS7无法打开IIS管理器的解决方法。

症状&#xff1a;管理工具中的IIS管理器双击无反应&#xff0c;右键打开无反应。 我的电脑上右键管理&#xff0c;打开服务和应用程序&#xff0c;双击IIS管理器&#xff0c;闪开闪关。 解决办法&#xff1a;开始→运行→输入inetmgr.exe /reset 搞定&#xff0c;原因不明。。…

iis无法访问问题

早晨接到电话&#xff0c;说网络无法访问。想想昨天还可以怎么今天就不可以了呢&#xff1f; 回来后发现确实是&#xff0c;只有自己的机器可以访问&#xff0c;换一台就无法访问。 赶快百度。 首先百度到如下的网页&#xff0c;进行解决。 XP下iis服务器无法访问的问题 20…

『已解决』IIS启动 服务无法在此时接受控制信息

iis启动 服务无法在此时接受控制信息 问题描述&#xff1a;每隔一段时间应用程序池就会自动停止&#xff0c;报错&#xff1a;服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425) iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425) iis应用池启动…

IIS已经安装,但无法打开的解决方法

问题描述: IIS(Internet Information Services)已经安装到电脑上,但是进入管理工具就是无法打开,双击后无法弹出相应程序. 解决方法: 卸载IIS服务重新安装IIS服务 卸载步骤: 进入控制面板,点击启用或关闭Windows功能.出现第二个界面,取消勾选红色方框的两项后确定,一段时间后会…

IIS无法启动计算机上的服务W3SVC如何修复

错误提示 启动iis7管理服务器提示:无法启动计算机上的服务W3SVC 启动Windows Process Activation Service服务,报错:6801 指定资源管理器中的事务支持未启动或已关闭 启动world wide web publishing service服务,报错:1068&#xff1a;依赖服务或组无法启动 执行步骤 打开命令…

IIS站点无法启动,万维网发布服务无法开机启动解决办法

1、IIS站点无法启动&#xff0c;点击启动报错。 2、World Wide Web 发布服务&#xff08;w3svc&#xff09;设置为自动 却没有启动。 特此记录下解决方法。 1&#xff09;打开服务列表&#xff0c;找到World Wide Web 发布服务&#xff0c;右键属性&#xff0c;查找依赖关系&a…

比较简单实用并且免费的端口映射(内网穿透)工具

“端口映射”通俗来说就是将外网主机的IP地址端口映射到内网中一台机器&#xff0c;提供相应的服务。内网相通&#xff0c;电因特网对外开放服务或者接收大数据&#xff0c;都需要端口映射。首先&#xff0c;想要做好端口映射&#xff0c;确定路由器&#xff0c;清楚的认识软件…

80端口映射外网方法

在本地服务器搭建了IIS或apache等web网站后&#xff0c;除了局域网内访问需要&#xff0c;还需要提供互联网访问站点&#xff0c;这时一般就需要路由器80端口映射设置。端口映射&#xff0c;即从一个网络环境下的端口映射到另一个网络环境下访问的过程。通常由软件方式来提供这…

内网用端口映射

第一步&#xff0c;保证你内网的机器通过所谓的代理服务器能顺利连上internet&#xff0c;这里就不多说了&#xff0c;粗略的写写。 看看这图&#xff0c;至于这个具有公网IP的代理服务器&#xff08;或称代理网关&#xff09;如何接入internet&#xff08;也是就问号里的东东&…

内网穿透用什么软件好?本地设置内网端口映射到外网访问

我们经常听到有人说在用内网穿透工具&#xff0c;那么内网穿透工具有什么作用呢&#xff1f;内网穿透工具的作用是将本地内网服务器和应用提供到互联网上连接访问&#xff0c;可以解决在无公网IP条件下跨网互通互连问题。比如在家远程办公&#xff0c;访问公司内部办公OA服务器…

windows 下端口转发 端口映射工具 passport 端口映射

下载地址 http://sourceforge.net/projects/pjs-passport/ 参考 https://yanbin.blog/windows-port-forwarding-passport/

windows10环境下进行端口映射连接内网

&#xff08;1&#xff09;下载安装包&#xff08;免安装&#xff09; tfcenter安装包https://share.weiyun.com/tFAN6x5p&#xff08;2&#xff09;解压并执行tfcenter.exe软件&#xff0c;提示运行已成功 &#xff08;3&#xff09;右击最小化图标&#xff0c;打开网页并选择…

免费内网端口映射、内网穿透

网络通永久免费内网端口映射,内网穿透软件&#xff0c;可轻松访问连接内网&#xff0c;100%穿透内网&#xff0c;不需设置路由器&#xff0c;不需公网ip,不需固定ip,不需动态域名&#xff0c;用户可免费添加多个映射,适合在公司&#xff0c;小区宽带&#xff0c;出租屋&#xf…

windows平台端口映射工具的使用

目录 1.系统自身netsh命令 2.使用Portmap 3.使用PortTunnel 4.测试 1.系统自身netsh命令 优点:不需第三方软件.缺点:没有白名单,黑名单功能.只能通过防火墙功能进行设置. //增加端口映射 netsh interface portproxy add v4tov4 listenaddress0.0.0.0 listenport3390 conn…