執行階段如何找出組件
更新:2007 年 11 月
若要成功部署您的 .NET Framework 應用程式,您必須熟悉 Common Language Runtime 如何找出並繫結至構成您應用程式的組件。預設情況下,Runtime 會試著與應用程式所用以建置的組件的正確版本繫結。這個預設行為可以由組態檔設定來覆寫。
Common Language Runtime 嘗試找出組件並解析組件參考時會執行一些步驟。各個步驟將在下列章節中說明。詞彙「探查」經常被使用說明執行階段如何找出組件;它意指一種啟發方式的集合,用以根據組件名稱和文化特性 (Culture) 來找出組件。
注意事項: |
---|
您可以使用隨附於 Windows Software Development Kit (SDK) 中的組件繫結記錄檔檢視器 (Fuslogvw.exe),在記錄檔中檢視繫結資訊。 |
初始化繫結
尋找和繫結組件的處理序是在執行階段嘗試解析另一個組件的參考時開始。這個參考可以是靜態或動態的。編譯器 (Compiler) 於建置階段在組件資訊清單 (Assembly Manifest) 的中繼資料 (Metadata) 中記錄靜態參考。動態參考則在產生於呼叫各種方法的執行過程中建構,例如 System.Reflection.Assembly.Load。
參考組件的最佳方式為使用完整參考,包括組件名稱、版本、文化特性和公開金鑰語彙基元 (只要有一個存在的話)。Runtime 會依照這個章節稍後說明的步驟,使用這項資訊來找出組件。不論是否為靜態或動態組件的參考,Runtime 都使用相同的解析過程。
您也可以提供只包含部分資訊的呼叫方法 (例如只指定組件名稱),來動態參考組件。在這種情況下,只會搜尋應用程式目錄中的組件,而不會進行其他檢查。您可以使用多種不同方法中的任何一種載入組件,如 System.Reflection.Assembly.Load 或 System.AppDomain.Load。
最後,您可以使用 System.Reflection.Assembly.Load 之類的方法進行動態參考,只提供部分資訊;然後再使用應用程式組態檔中的 <qualifyAssembly> 項目來限定參考。這個項目可讓您在應用程式組態檔中提供完整的參考資訊 (名稱、版本、文化特性和可用的公開金鑰語彙基元),而不是在程式碼中提供。如果您想要完整限定參考應用程式目錄之外的組件,或者如果您想要參考全域組件快取中的組件,但是為了方便又希望能在組態檔中指定完整參考,而不是在程式碼中指定的話,就可以使用這個技巧。
注意事項: |
---|
這種部分參考不可搭配使用多個應用程式之間共用的組件。這是因為組態設定是依照應用程式套用,而不是依照組件套用,因此使用這種類型部分參考的共用組件,會要求使用共用組件的每一個應用程式組態檔中都要有限定資訊。 |
Runtime 使用下列步驟解析組件參考:
決定正確的組件版本,藉由檢查適用的組態檔,包括應用程式組態檔、發行者原則檔和電腦組態檔。如果組態檔位於遠端電腦,Runtime 必須首先找出並下載應用程式組態檔。
檢查組件名稱是否先前已經被繫結,若果真如此,則使用先前載入的組件。如果先前載入組件的要求失敗,此要求會立即失敗,而不會嘗試載入組件。
注意事項: 組件繫結失敗的快取是 .NET Framework 2.0 版所新增的功能。
檢查全域組件快取。如果組件在那裡找到,Runtime 即使用這個組件。
探查組件,使用下列步驟:
如果組態和發行者原則不會影響原始參考,並且如果繫結要求是使用 Assembly.LoadFrom 方法來建立的,Runtime 會檢查位置提示。
如果程式碼基底存在於組態檔,Runtime 只會檢查這個位置。如果這個探查失敗,Runtime 將斷定繫結要求失敗,並且沒有其他探查會發生。
使用啟發方式的組件探查會在探查章節中說明。如果探查之後沒有找到組件,Runtime 會要求 Windows Installer 提供組件。這將扮演隨選安裝的功能。
注意事項: Runtime 不會對沒有強式名稱 (Strong Name) 的組件進行版本檢查,也不會在全域組件快取中檢查沒有強式名稱的組件。