详解.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核心技术原理与框架》

目录
相关文章
|
25天前
|
开发框架 JavaScript 前端开发
【App Service】解决 .NET Profiler 报告打开后无数据加载的问题
Azure App Service 上的应用遭遇性能问题时,可以使用Profiler收集.NET应用的Trace,它在60秒内自动停止,不会重启应用。若Trace报告加载失败,可能是由于资源如`angular.min.js`无法访问。解决办法是找到中国区Azure可访问的资源副本,例如使用BootCDN替代Google API,然后通过App Service的Kudu控制台编辑HTML文件进行替换。完成替换后,Profiler报告应能正常加载。
|
29天前
|
存储 安全 C#
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
|
29天前
|
开发框架 前端开发 JavaScript
程序与技术分享:ASP.NET发展史(【译】)
程序与技术分享:ASP.NET发展史(【译】)
19 0
|
1月前
|
网络协议
技术好文:Smark.Net实现简单聊天程序
技术好文:Smark.Net实现简单聊天程序
15 0
|
1月前
|
自然语言处理 C# 图形学
​一款开源的.NET程序集反编译、编辑和调试神器
本文介绍了.NET反编译和调试工具dnSpyEx的使用方法。dnSpyEx是dnSpy的非官方Fork版本,支持.NET Framework、.NET Core和Unity程序集的调试和编辑,具有多种语言界面。主要功能包括:浅色、蓝色和深色主题,调试支持,代码编辑以及多语言支持。用户可以从GitHub下载并直接运行dnSpyEx,无需安装。通过创建测试项目,编译成dll文件,然后使用dnSpyEx进行调试和编辑程序集中的代码和IL指令。此外,文章还提供了项目源码地址和相关优秀项目的链接。
|
2月前
|
开发框架 .NET 开发工具
LabVIEW加载.NET程序集
LabVIEW加载.NET程序集
43 1
|
2月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
118 0
|
2月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
47 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
184 5
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界