程序集的加载

  程序集的加载涉及到很多方面的知识.包括配置文件,全局缓存装配,私有目录等的查

找.用LoadAWithPartialName方法加载程序集,必须提供程序集的文本名称,还可以包

公钥标记,版本或区域性等.但不必包含完全引用信息如(名称,版本,区域性,公钥标记)
 
  使用(system.reflection.Assembly.Load)并仅指定部分引用,运行库在全局程序

集缓存和应用程序根目录中对程序集进行检查. 使用LoadWithPartialName方法并仅

指定部分引用,运行库在应用程序目录中和全局程序集缓存中对程序集进行检查.另外,提

供部分引用,可在应用程序集的配置文件中提供完全引用的信息.

  使用Load提供部分引用程序集的查找:1. 在应用程序的配置文件中检查

<qualifyAssembly>元素中相关的限定信息.如果找到了,则将部分引用的限制条件转

化为新的引用限定条件.假如:<qualifyAssembly partialName="mydll"

fullName="mydll,version=1.0.0.1,publicKeyToken=xxx,culture=zh-CN">

当发生以下调用时:Assembly a=Assembly.Load("mydll");则将条件转化为更强的

条件"mydll,version=1.0.0.1,publicKeyToken=xxx,culture=zh-CN". 2.根据

指定的限定条件在全局程序集缓存中匹配.如果有一个或多个匹配项,则取第一个匹配的

程序集,进入第4步.否则就进入第3步. 3.在应用程序目录下根据更强的限定条件匹配,

如果有一个或多个匹配,就取第一个,进入第4步,否则局部引用失败 4.指定了版本策略

则对匹配的程序集应用版本策略.

<dependentAssembly>
   
<assemblyIdentity name="mydll" publicKeyToken="xxx" culture="zh-CN"></assemblyIdentity>
   
<bindingRedirect oldVersion="1.3.0.0" newVersion="1.2.0.0"></bindingRedirect>
</dependentAssembly>

根据版本策略,最后加载的是新版本"mydll,publicKeyToken=xxx,culture=zh-CN,version=1.2.0.0"

  假如是LoadPartialName 则先从应用程序根目录下匹配,没找到匹配项则从全局程序集缓存中去匹配..一样也应用版本

策略.匹配的过程中,还要考虑到区域性文化的问题 如:

<configuration>
  
<runtime>
    
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       
<qualifyAssembly partialName="mydll" fullName="mydll,version=1.2.0.0,culture=zh-CN,publicKeyToken=xxx"/>
       
<dependentAssembly>
          
<assemblyIdentity name="mydll",publicKeyToken="xxx" culture="zh-CN"/>
       
</dependentAssembly>
       
<bindingRedirect oldVersion="1.2.0.0" newVersion="1.3.0.0">
    
</assemblyBinding>
  
</runtime>
</configuration>

在全局程序集缓存中有: mydll,version="1.2.0.0",publicKeyToken=xxx,culture=zh-CN和

                   mydll,version="1.3.0.0",publicKeyToken=xxx,culture=en-US

在私有目录下有       mydll,version="1.3.0.0",publicKeyToken=xxx,culture=zh-CN

                   mydll,version="1.3.0.0",publicKeyToken=xxx,culture=en-US

则找到的是 私有目录下:mydll,version="1.3.0.0",publicKeyToken=xxx,culture=zh-CN

第一步 转化为更强的限定条件:mydll,version="1.2.0.0",publicKeyToken=xxx,culture=zh-CN 在全局程序集缓存

中查找.并根据culture寻找匹配,在应用版本策略和区域性匹配后,没找到1.3.0.0版本 就到私有目录下匹配...

<摘自"精通.net核心技术原理与框架">

posted @ 2007-11-29 11:13 孤城浪子 阅读(...) 评论(...) 编辑 收藏
博客园,让我更上一层楼