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

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

时间: 2024-12-29 17:28:36

详解.NET程序集的加载规则的相关文章

一起谈.NET技术,详解.NET程序集的加载规则

程序集的加载涉及到很多方面的知识,包括配置文件.全局缓存装配.私有目录等的查找.用LoadAWithPartialName方法加载程序集,必须提供程序集的文本名称,还可以包公钥标记.版本或区域性等,但不必包含完全引用信息,如名称.版本.区域性.公钥标记. 使用(System.Reflection.Assembly.Load)并仅指定部分引用,运行库在全局程序集缓存和应用程序根目录中对程序集进行检查.使用LoadWithPartialName方法并仅指定部分引用,运行库在应用程序目录中和全局程序集

详解jQuery lazyload 懒加载_jquery

Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担.            Demo页面:            基本选项            淡入效果           

详解js异步文件加载器_php实例

我们经常会遇到这种场景,某些页面依赖第三方的插件,而这些插件比较大,不适合打包到页面的主js里(假设我们使用的是cmd的方式,js会打包成一个文件),那么这个时候我们通常会异步获取这些插件文件,并在下载完成后完成初始化的逻辑. 以图片上传为例,我们可能会用到plupload.js这个插件,那么我们会这么写: !window.plupload ? $.getScript( "/assets/plupload/plupload.full.min.js", function() { self

详解Android之图片加载框架Fresco基本使用(二)

PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,PostProcesser,Image Request 4.渐进式JPEG与动图的显示 最近这两天把Fresco的官方文档算是看了个差不多,就剩下Fresco的基本原理还有结合okHttp等类库如何使用的问题,虽然官方文档给出的功能比较的多,比如说自定义View,缩略图显示等等,这些我也基本就看了个大概,觉

详解.NET程序集“.NET研究”的加载规则

程序集的加载涉及到很多方面的知识,包括配置文件.全局缓存装配.私有目录等的查找.用LoadAWithPartialName方法加载程序集,必须提供程序集的文本名称,还可以包公钥标记.版本或区域性等,但不必包含完全引用信息,如名称.版本.区域性.公钥标记. 使用(System.Reflection.Assembly.Load)并仅指定部分引用,运行库在全局程序集缓存和应用程序根目录中对程序集进行检查.使用LoadWithPartialName方法并仅指定部分引用,运行库在应用程序目录中和全局程序集

详解.NET程序集“.NET技术”的加载规则

程序集的加载涉及到很多方面的知识,包括配置文件.全局缓存装配.私有目录等的查找.用LoadAWithPartialName方法加载程序集,必须提供程序集的文本名称,还可以包公钥标记.版本或区域性等,但不必包含完全引用信息,如名称.版本.区域性.公钥标记. 使用(System.Reflection.Assembly.Load)并仅指定部分引用,运行库在全局程序集缓存和应用程序根目录中对程序集进行检查.使用LoadWithPartialName方法并仅指定部分引用,运行库在应用程序目录中和全局程序集

基础才是重中之重~网站bin目录下的程序集自动加载

网站bin目录下的程序集一般由系统项目,项目引用的外部DLL及外挂DLL组成,它们在网站运行时会自动加载,这一点很重要,项目本身DLL及项目引入的DLL会自动加载,这没有问题,而外挂在bin目录的DLL也会自动加载,这很重要,因为,它可以使我们的应用程序更加灵活,在开发通用功能上,也显得扩展性更强! 一个例子,比如一个HttpModule,它是一个通用的功能,向页面添加一些缓存过期的共用信息,这对于你所有网站都是共用的,这时,可以建立一个HttpModule项目,它代码可能是这样 namespa

c#语言重点知识详解(四:加框与解框)

详解 第四章:C# 中的加框与去框 C# 运行时中有两种类型:引用类型(reference)(在 C# 中用类声明)和值类型(value)(在 C# 中用结构声明).引用和值类型在几个重要方面有所不同.值类型"感觉上"象一个数据.它包括预定义数值类型(如int.bool)以及用户定义的类型(circle.Point等).如上文所述,值类型的变量是实际的值,所以在您使用变量时,通常处理的是实际的值. 1>:首先,让我们来看一看值类型(value)(在 C# 中用结构声明). 对于任

详解PHP数据压缩、加解密(pack, unpack)

网络通信.文件存储中经常需要交换数据,为了减少网络通信流量.文件存储大小以及加密通信规则,经常需要对数据进行双向加解密以保证数据的安全. PHP中实现此功能主要需要使用的函数主要是pack及unpack函数 pack 压缩资料到位字符串之中. 语法: string pack(string format, mixed [args]...); 返回值: 字符串 本函数用来将资料压缩打包到位的字符串之中. a - NUL- 字符串填满[padded string] 将字符串空白以 NULL 字符填满