• 详解.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版本,就到私有目录下匹配...


  • 相关阅读:
    传统线程互斥和同步通信
    【计算机视觉】人脸表情识别技术
    【计算机视觉】人脸识别--人脸识别技术综述
    【计算机视觉】人脸识别--人脸识别技术综述
    【计算机视觉】人脸识别之人脸对齐(一)--定义及作用
    【计算机视觉】人脸识别之人脸对齐(一)--定义及作用
    【神经网络与深度学习】转-caffe安装吐血总结
    【神经网络与深度学习】转-caffe安装吐血总结
    【图像处理与医学图像处理】YUV与RGB格式转换速度几种方法对比
    【图像处理与医学图像处理】YUV与RGB格式转换速度几种方法对比
  • 原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978656.html
Copyright © 2020-2023  润新知