• 【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元素,那么应用程序就会恢复如初。

  • 相关阅读:
    产品生成器模块的问题图片处理
    jQueryinteface效果集合
    aspx页面中文汉字显示为乱码
    实用的正则表达式
    用javascript操作xml
    标注上下标的方法
    1740 博弈
    1028 母函数
    To resolve the problem of sharepoint can not login
    Modify Sharepoint Login UI
  • 原文地址:https://www.cnblogs.com/vvjiang/p/5233363.html
Copyright © 2020-2023  润新知