先來點與標題不相關的:
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提供了豐富的信息。其中包括:
以上這塊代碼和描述完全跟書上一模一樣。
CLR會在編譯方法時,判斷它引用了哪些類型和成員,然後查找進行引用的程序集中的AssemblyRef元數據引用表,判斷程序集引用了哪些程序集,然後檢查配置文件,進行指定的版本號重定向工作。(也就是dependentAssembly,assemlyIdentity和bindingRedirect元素所做的操作)。
CLR到此時知道了真正需要加載的程序集版本,會向GAC加載(你可以理解為在我們各自電腦中一個共享的程序集的文件夾)。如果執行最後一次重定向操作的配置文件同時包含codeBase中,那麼檢查codeBase元素,CLR從指定URL加載程序集,否則就會在應用程序根目錄中查找,找不到就在根目錄下,由配置文件probing指定的目錄:即文中的AuxFiles和bin\subdir子目錄中查找。首先會查找dll文件,找不到dll文件會將後綴名改為exe再按照規則查找。
如果在配置文件中刪除bindingRedirect元素,那麼應用程序就會恢復如初。