详解.NET程序集“.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,public上海网站建设KeyToken=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 >
  
<上海闵行企业网站制作span style="color: #800000;">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核心技术原理与框架》

目录
相关文章
|
19天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
67 13
|
2月前
|
算法 Linux API
.NET图像处理的艺术 — 从加载到添加文本,一步步领略图像处理的奇妙世界
.NET图像处理的艺术 — 从加载到添加文本,一步步领略图像处理的奇妙世界
40 2
|
2月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
115 0
|
3月前
|
Ubuntu 持续交付 API
如何使用 dotnet pack 打包 .NET 跨平台程序集?
`dotnet pack` 是 .NET Core 的 NuGet 包打包工具,用于将代码打包成 NuGet 包。通过命令 `dotnet pack` 可生成 `.nupkg` 文件。使用 `--include-symbols` 和 `--include-source` 选项可分别创建包含调试符号和源文件的包。默认情况下,`dotnet pack` 会先构建项目,可通过 `--no-build` 跳过构建。此外,还可以使用 `--output` 指定输出目录、`-c` 设置配置等。示例展示了创建类库项目并打包的过程。更多详情及命令选项,请参考官方文档。
246 11
|
3月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
3月前
|
自然语言处理 C# 图形学
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
|
4月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
58 0
|
4月前
|
开发框架 JavaScript 前端开发
【App Service】解决 .NET Profiler 报告打开后无数据加载的问题
【App Service】解决 .NET Profiler 报告打开后无数据加载的问题
|
4月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
4月前
|
开发框架 NoSQL .NET
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性