博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解.NET程序集的加载规则
阅读量:6986 次
发布时间:2019-06-27

本文共 2175 字,大约阅读时间需要 7 分钟。

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

转载于:https://www.cnblogs.com/waw/archive/2011/10/13/2210621.html

你可能感兴趣的文章
《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
查看>>
leetcode409.Longest Palindrome
查看>>
以太坊客户端Ethereum Wallet与Geth区别简介
查看>>
蚂蚁区块链平台BaaS技术解析与实践
查看>>
Nervos 双周报第 3 期:佛系新年之后的开工大吉!
查看>>
测试开发系类之接口自动化测试
查看>>
【PHP 扩展开发】Zephir 基础篇
查看>>
HTML
查看>>
HashMap浅析?
查看>>
字节跳动开源Go结构体标签表达式解释器,成请求参数校验的杀手锏
查看>>
怎么将在线录制的视频转为GIF动态图
查看>>
js的setTimeout和Promise---同步异步和微任务宏任务
查看>>
【剑指offer】顺时针打印矩阵
查看>>
以太坊交易池处理逻辑
查看>>
怎么将图片上传封装成指令?
查看>>
leetcode讲解--861. Score After Flipping Matrix
查看>>
干货 | 金融级互联网产品持续交付的挑战与应对
查看>>
一道面试题引发的思考 --- 理解 new 运算符
查看>>
聊聊JavaScript和Scala的表达式 Expression
查看>>
[原]数据科学教程: 如何使用 mlflow 管理数据科学工作流
查看>>