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
版权声明:本文标题:Assembly Manifest 通俗简易手册 内容由热心网友自发贡献,该文观点仅代表作者本人,
转载请联系作者并注明出处:https://m.elefans.com/dongtai/1716098934a486072.html,
本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论