admin管理员组

文章数量:1531791

2024年5月19日发(作者:)

Assembly Manifest 通俗简易手册

恩,为了大家都能很方便的理解,我将尽量简单通俗地进行描述。

[现象]

对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)

写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件 拷贝到

别人电脑上时,便不能运行了,大致的错误提示如下:应用程序配置不正确,请

重新安装程序„„或者是 没有找到什么的(我记得不是很清楚,

不过大致是这样的)

[分析]

看到这样的提示,当然不会傻到重装咯。第一反应应该是什么配置有问题、或者

是缺少了什么依赖的库文件;于是我就根据以前Windows缺少库文件的经验, 把

所有库文件(××.DLL)统统一股脑地复制到当前文件夹下来,满心欢喜以为可

以运行了,以运行„„@#¥@#%¥„„还是挂了。

[探索]

于是开始网上搜索,我Google,我摆渡;渐渐我发现,这一切都和一个叫做

***.manifest 类型的文件发生关系,那么到底什么是 .manifest 文件呢?他有

什么用,以前为什么没有?

后来,经过艰苦努力,终于得知,原来这一切都是Windows 的Assembly Manifest

搞的鬼。这个东东的作用就是为了解决 以前windows上的“Dll 地狱” 问题才

产生的新的DLL管理解决方案。大家知道,Dll是动态加载共享库,同一个Dll

可能被多个程序所使用,而所谓“Dll 地狱”就是当不通程序依赖的Dll相同,

但版本不同时,由于系统不能分辨到底哪个是哪个,所以加载错了Dll版本,然

后就挂了。于是盖茨就吸取了教训,搞 了一个程序集清单的东东,每个程序都

要有一个清单,这个清单存再和自己应用程序同名的.manifest文件中,里面列

出其所需要的所有依赖,这儿所列出 的依赖可不是简单地靠文件明来区分的,

而是根据一种叫做“强文件名”的东西区分的,那么什么是强文件明呢?我们来

看一下这个.manifest文件便知道 了。

manifestVersion='1.0'>

version='8.0.50608.0' processorArchitecture='x86'

publicKeyToken='1fc8b3b9a1e18e3b' />

我们发现原来这是一个XML格式的文件,其中这一部分指明了其依

赖于一个名字叫做的库。但是我们发现,

属性里面还有其它的东东,分别是

type系统类型,version版本号,processorArchitecture平台环境,

publicKeyToken公匙(一般用来标示一个公 司)„„把他们加在一起便成了

“强文件名”了,有了这种“强文件名”,我们就可以根据其区分不同的版本、

不同的平台„„总之,有了这种强文件名,系统中可 以有多个不同版本的相同

的库共存而不会发生冲突。

[深入]

恩,那么现在,我们就来具体了解一下这一套机制。

首先是强弱文件名的问题。正如上面提到的那样,为了区分不同版本或不同厂商

生成的相同的程序集,必须用一个Assembly Manifest程序清单来列出我这个程

序集的强文件名--慢着,到这里你可能会问:刚才不是说Assembly Manifest

程序清单是列出其所依赖的程序集的强文件名呢,怎么这里变成了当前文件的强

文件明了呢?其实,Assembly Manifest程序清单有两部分功能,上面这个实例

之所以标注了其所依赖的文件的强文件名是因为其是客户端的Assembly

Manifest,在服务端有另外一个Manifest 来标注。

version="8.0.50727.42" processorArchitecture="x86"

publicKeyToken="1fc8b3b9a1e18e3b">

hashalg="SHA1">

xmlns:dsig="/2000/09/xmldsig#">

orm

Algorithm="urn:schemas-microsoft-com:ty">

m>

Algorithm="/2000/09/xmldsig#sha1">

:DigestValue>phRUExlAeZ8BwmlD8VlO5udAnRE=

ash>

hashalg="SHA1">

xmlns:dsig="/2000/09/xmldsig#">

orm

本文标签: 文件问题文件名依赖程序