程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【C#進階系列】03 配置文件管理與程序集的引用版本重定向,

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

編輯:C#入門知識

【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;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元素,那麼應用程序就會恢復如初。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved