zoukankan      html  css  js  c++  java
  • 【C#进阶系列】03 配置文件管理与程序集的引用版本重定向

    先来点与标题不相关的:

    CLR支持两种程序集:弱命名程序集和强命名程序集。

    两者的区别在于强命名程序集使用发布者的公钥和私钥进行签名。由于程序集被唯一性地标识,所以当应用程序绑定到强命名程序集时,CLR可以应用一些已知安全的策略。

    程序集可以采用两种方式部署:私有或者全局。弱命名程序集只能以私有方式部署。

    在《CLR via C#》的第三章主要讲了私有部署和全局部署的具体内容,以及弱命名程序集和强命名程序集。

    但是老实说一般情况下确实用不到这些东西,所以这里就不写了。

    还有一个就是对CLR如何解析类型引用的讲解,其实也简单,在前面也略微提到了点,所以也不讲了。

    好了,接下来看看我认为本章有用的知识点,也就是标题的内容:

    配置文件管理

    所谓配置文件,就是管理我们程序里那个.config后缀的文件。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <probing privatePath="AuxFiles;binsubdir"/>
          <dependentAssembly>
            <assemblyIdentity name="JeffTypes" publicKeyToken="32ab4ba45e0a69a1" culture="neutral"/>
            <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
            <codeBase version="2.0.0.0" href="http://www.wintellect.com/JeffTypes.dll"/>
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="TypeLib" publicKeyToken="1f2e74e897abbcfe" culture="neutral"/>
            <bindingRedirect oldVersion="3.0.0.0-3.5.0.0" newVersion="4.0.0.0"/>
            <publisherPolicy apply="no"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>

     这个XML文件为CLR提供了丰富的信息。其中包括:

    • probing元素  查找一个弱命名程序集时,检查应用程序基目录的AuxFiles和binsubdir子目录。对于强命名程序集,CLR会检查GAC或者codeBase元素指定的URL。只有在未指定codeBase元素的前提下,CLR才会在应用程序的私有路径中检查强命名程序集。
    • 第一个dependentAssembly,assemlyIdentity和bindingRedirect元素  查找由控制着公钥标记32ab4ba45e0a69a1的那个组织发布的、语言文化中性的JeffTypes程序集的1.0.0.0版本时,改为定位同一个程序集的2.0.0.0版本。
    • codeBase元素  查找由控制着公钥标记32ab4ba45e0a69a1的组织发布的、语言文化为中性的JeffTypes程序集的2.0.0.0版本时,尝试在以下URL处发现它:http://www.Wintellect.com/JeffTypes.dll。虽然第2章没有特别指出,但codeBase元素也能用于弱命名程序集。在这种情况下,程序集的版本号会被忽略,而且根本就不应该在XML codeBase元素中写这个版本号。此外,codeBase所定义的URL必须引用应用程序基目录下的一个子目录。
    • 第2个dependentAssembly,assemblyIdentity和bindingRedirect元素  查找由控制着公钥标记1f2e74e897abbcfe的那个组织发布的、语言文化中性的TypeLib程序集的3.0.0.0到3.5.0.0版本时(包括3.0.0.0和3.5.0.0在内),改为定位同一个程序集的4.0.0.0版本。
    • publisherPolicy元素  如果生成TypeLib程序集的组织部署了一个发布者策略文件,CLR应该忽略该文件。

    以上这块代码和描述完全跟书上一模一样。

    CLR会在编译方法时,判断它引用了哪些类型和成员,然后查找进行引用的程序集中的AssemblyRef元数据引用表,判断程序集引用了哪些程序集,然后检查配置文件,进行指定的版本号重定向工作。(也就是dependentAssembly,assemlyIdentity和bindingRedirect元素所做的操作)。

    CLR到此时知道了真正需要加载的程序集版本,会向GAC加载(你可以理解为在我们各自电脑中一个共享的程序集的文件夹)。如果执行最后一次重定向操作的配置文件同时包含codeBase中,那么检查codeBase元素,CLR从指定URL加载程序集,否则就会在应用程序根目录中查找,找不到就在根目录下,由配置文件probing指定的目录:即文中的AuxFiles和binsubdir子目录中查找。首先会查找dll文件,找不到dll文件会将后缀名改为exe再按照规则查找。

    如果在配置文件中删除bindingRedirect元素,那么应用程序就会恢复如初。

  • 相关阅读:
    nowcoderD Xieldy And His Password
    Codeforces681D Gifts by the List
    nowcoder80D applese的生日
    Codeforces961E Tufurama
    Codeforces957 Mahmoud and Ehab and yet another xor task
    nowcoder82E 无向图中的最短距离
    nowcoder82B 区间的连续段
    Codeforces903E Swapping Characters
    Codeforces614C Peter and Snow Blower
    Codeforces614D Skills
  • 原文地址:https://www.cnblogs.com/vvjiang/p/5233363.html
Copyright © 2011-2022 走看看