欢迎来到天天文库
浏览记录
ID:35198669
大小:40.50 KB
页数:5页
时间:2019-03-21
《assemblymanifest通俗简易手册》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、AssemblyManifest通俗简易手册恩,为了大家都能很方便的理解,我将尽量简单通俗地进行描述。[现象]对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提示如下:应用程序配置不正确,请重新安装程序……或者是MSVCR80D.dll没有找到什么的(我记得不是很清楚,不过大致是这样的)[分析]看到这样的提示,当然不会傻到重装咯。第一反应应该是什么配置有问题、或者是缺少了什么依赖的库文件;于是我就根据以前Windows
2、缺少库文件的经验,把所有库文件(××.DLL)统统一股脑地复制到当前文件夹下来,满心欢喜以为可以运行了,以运行……@#¥@#%¥……还是挂了。[探索]于是开始网上搜索,我Google,我摆渡;渐渐我发现,这一切都和一个叫做***.manifest类型的文件发生关系,那么到底什么是.manifest文件呢?他有什么用,以前为什么没有?后来,经过艰苦努力,终于得知,原来这一切都是Windows的AssemblyManifest搞的鬼。这个东东的作用就是为了解决以前windows上的“Dll地狱”问题才产生的新的DLL管理解决方案。大家知道,Dll是动态加载共享
3、库,同一个Dll可能被多个程序所使用,而所谓“Dll地狱”就是当不通程序依赖的Dll相同,但版本不同时,由于系统不能分辨到底哪个是哪个,所以加载错了Dll版本,然后就挂了。于是盖茨就吸取了教训,搞了一个程序集清单的东东,每个程序都要有一个清单,这个清单存再和自己应用程序同名的.manifest文件中,里面列出其所需要的所有依赖,这儿所列出的依赖可不是简单地靠文件明来区分的,而是根据一种叫做“强文件名”的东西区分的,那么什么是强文件明呢?我们来看一下这个.manifest文件便知道了。
4、ndalone='yes'?>5、dency>我们发现原来这是一个XML格式的文件,其中这一部分指明了其依赖于一个名字叫做Microsoft.VC80.CRT的库。但是我们发现,属性里面还有其它的东东,分别是type系统类型,version版本号,processorArchitecture平台环境,publicKeyToken公匙(一般用来标示一个公司)……把他们加在一起便成了“强文件名”了,有了这种“强文件名”,我们就可以根据其区分不同的版本、不同的平台……总之,有了这种强文件名,系统中可以有多个不同版本的6、相同的库共存而不会发生冲突。[深入]恩,那么现在,我们就来具体了解一下这一套机制。首先是强弱文件名的问题。正如上面提到的那样,为了区分不同版本或不同厂商生成的相同的程序集,必须用一个AssemblyManifest程序清单来列出我这个程序集的强文件名--慢着,到这里你可能会问:刚才不是说AssemblyManifest程序清单是列出其所依赖的程序集的强文件名呢,怎么这里变成了当前文件的强文件明了呢?其实,AssemblyManifest程序清单有两部分功能,上面这个实例之所以标注了其所依赖的文件的强文件名是因为其是客户端的AssemblyManifest,7、在服务端有另外一个Manifest来标注。8、licKeyToken="1fc8b3b9a1e18e3b">
5、dency>我们发现原来这是一个XML格式的文件,其中这一部分指明了其依赖于一个名字叫做Microsoft.VC80.CRT的库。但是我们发现,属性里面还有其它的东东,分别是type系统类型,version版本号,processorArchitecture平台环境,publicKeyToken公匙(一般用来标示一个公司)……把他们加在一起便成了“强文件名”了,有了这种“强文件名”,我们就可以根据其区分不同的版本、不同的平台……总之,有了这种强文件名,系统中可以有多个不同版本的
6、相同的库共存而不会发生冲突。[深入]恩,那么现在,我们就来具体了解一下这一套机制。首先是强弱文件名的问题。正如上面提到的那样,为了区分不同版本或不同厂商生成的相同的程序集,必须用一个AssemblyManifest程序清单来列出我这个程序集的强文件名--慢着,到这里你可能会问:刚才不是说AssemblyManifest程序清单是列出其所依赖的程序集的强文件名呢,怎么这里变成了当前文件的强文件明了呢?其实,AssemblyManifest程序清单有两部分功能,上面这个实例之所以标注了其所依赖的文件的强文件名是因为其是客户端的AssemblyManifest,
7、在服务端有另外一个Manifest来标注。8、licKeyToken="1fc8b3b9a1e18e3b">
8、licKeyToken="1fc8b3b9a1e18e3b">
此文档下载收益归作者所有