【C#進階系列】03 配置文件管理與程序集的引用版本重定向

先來點與標題不相關的:安全

CLR支持兩種程序集:弱命名程序集和強命名程序集。app

二者的區別在於強命名程序集使用發佈者的公鑰和私鑰進行簽名。因爲程序集被惟一性地標識,因此當應用程序綁定到強命名程序集時,CLR能夠應用一些已知安全的策略。spa

程序集能夠採用兩種方式部署:私有或者全局。弱命名程序集只能以私有方式部署。code

在《CLR via C#》的第三章主要講了私有部署和全局部署的具體內容,以及弱命名程序集和強命名程序集。xml

可是老實說通常狀況下確實用不到這些東西,因此這裏就不寫了。blog

還有一個就是對CLR如何解析類型引用的講解,其實也簡單,在前面也略微提到了點,因此也不講了。utf-8

好了,接下來看看我認爲本章有用的知識點,也就是標題的內容:部署

配置文件管理get

所謂配置文件,就是管理咱們程序裏那個.config後綴的文件。it

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="AuxFiles;bin\subdir"/>
      <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和bin\subdir子目錄。對於強命名程序集,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和bin\subdir子目錄中查找。首先會查找dll文件,找不到dll文件會將後綴名改成exe再按照規則查找。

若是在配置文件中刪除bindingRedirect元素,那麼應用程序就會恢復如初。

相關文章
相關標籤/搜索