先來點與標題不相關的: CLR支持兩種程式集:弱命名程式集和強命名程式集。 兩者的區別在於強命名程式集使用發佈者的公鑰和私鑰進行簽名。由於程式集被唯一性地標識,所以當應用程式綁定到強命名程式集時,CLR可以應用一些已知安全的策略。 程式集可以採用兩種方式部署:私有或者全局。弱命名程式集只能以私有方式
先來點與標題不相關的:
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元素,那麼應用程式就會恢復如初。