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