Manifest与exe.config文件原理与结构的分析

本文详细分析了.NET程序中manifest与exe.config文件的作用,探讨了Windows Assembly Manifest如何解决DLL地狱问题。通过实例解释了强文件名的概念,以及CLR如何定位和加载程序集,包括配置文件、全局程序集缓存和代码探测的过程。最后,展示了如何通过配置文件实现程序集版本的重定向,以确保兼容性。
摘要由CSDN通过智能技术生成

[现象]
对这个问题的研究是起 源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提示如下:应用程序配置不正确,请重新安装程序……或者是MSVCR80D.dll 没 有找到什么的

[探索]
这一切都和一个叫做*.manifest类型的文件发生关系,那么到底什么是 .manifest 文件呢?

原来这一切都是Windows 的Assembly Manifest搞的 鬼。这个东西的作用就是为了解决以前windows上的“Dll Hell” 问题才产生的新的DLL管理解决方案。大家知道,Dll是动态加载共享库,同一个Dll可能被多个程序所使用,而所谓“Dll Hell”就是当不同程序依赖的Dll相同,但版本不 同时,由于系统不能分辨到底哪个是哪个,所以加载错了Dll版本,然后就挂 了。于是盖茨就吸取了教训,搞了一个程序集清单的东西,每个程序都要有一个清单,这个清单存在和自己应用程序同名的.manifest文件中,里面列出其所需要的所有依赖,这儿所列出的依赖可不是简单地靠文件名来区分的,而是根据一种叫做“强文件名”的东西区分的,那么什么是强文件名呢?我们来看一下这个.manifest文件便知道了。
(我们可以使用VS 自带的工具ildasm.exe查看程序集的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>
  </assembly>
  
我们发现原来这是一个XML格式的文件,其中<dependency>这一部分指明了其依赖于一个名字叫做Microsoft.VC80.CRT的库。但是我们发现,<assemblyIdentity>属性里面还有其它的属性,分别是
type系统类型,version版本号,processorArchitecture平台环境,publicKeyToken公匙(一般用来标示一个公司)……把他们加在一起便成了“强文件名”了,有了这种“强文件名”,我们就可以根据其区分不同的版本、不同的平台……总之,有了这种强文件名,系统中可以有多个不同版本的相同的库共存而不会发生冲突。

[深入]

恩,那么现在,我们就来具体了解一下这一套机制。
首先是强弱文件名的问题。正如上面提到的那样,为了区分不同版本或不同厂商生成的相同的程序集,必须用一个Assembly Manifest程序清单来列出我这个程序集的强文件名--慢着,到这里你可能会问:刚才不是说Assembly Manifest程序清单是列出其所依赖的程序集的强文件名呢,怎么这里变成了当前文件的强文件名了呢?其实,Assembly Manifest程序清单有两部分功能,上面这 个实例之所以标注了其所依赖的文件的强文件名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值