详解.NET程序集的加载规则

简介:   程序集的加载涉及到很多方面的知识,包括配置文件、全局缓存装配、私有目录等的查找。用LoadAWithPartialName方法加载程序集,必须提供程序集的文本名称,还可以包公钥标记、版本或区域性等,但不必包含完全引用信息,如名称、版本、区域性、公钥标记。

  程序集的加载涉及到很多方面的知识,包括配置文件、全局缓存装配、私有目录等的查找。用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核心技术原理与框架》

目录
相关文章
|
7月前
.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
67 0
.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
|
8月前
|
编译器
.Net命名空间和程序集
我们都知道using有三个作用:·引入命名空间,创建别名,强制资源清理。这次对using 的“引入命名空间”的作用有了一点小疑问:命名空间和程序集有什么关系?
|
数据采集 uml 自然语言处理
.NetCore实践爬虫系统(二)自定义规则
回顾 上篇文章NetCore实践爬虫系统(一)解析网页内容 我们讲了利用HtmlAgilityPack,输入XPath路径,识别网页节点,获取我们需要的内容。评论中也得到了大家的一些支持与建议。下面继续我们的爬虫系统实践之路。
1032 0
|
监控 .NET
重温.NET下Assembly的加载过程
原文:重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程。虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没能解决我的问题,有些点写的不是特别详细,让人看完之后感觉还是云里雾里。
1092 0
C# .NET4.0 混合模式程序集异常
转自博客:     http://blog.csdn.net/shenyc/article/details/7872300  在.NET 4.0 下使用 Dirext3D 托管库,出现“混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
1028 0