隨類別數量增加,建立二進制元件成常態:想分離部分功能。不同處在於二進制元件可獨立保存離散功能。建立的組件組件可方便共享邏輯、跨語言程式設計、部署。
.NET 程式即組件包,每個程式可隨時更新發布。基於組件間應用程式多麼容易更新,組件間耦合多麼好!最小耦合意謂減少組件間複雜依賴關係,也意味著可簡單更新小塊新組件。本章關於建立簡單易用、易部署、易更新的組件。
.NET 環境應用程式可由多樣二進制元件組成。隨後可獨立更新這些元件,即在多組件應用程式中安裝更新單一組件。但必須明白 CLR 如何發現與載入組件。建立二進制元件時,必須建立符合明確期望的元件。
CLR 並不在程式啟動時載入所有引用組件。較適合做法:執行期需要程式成員時,載入器才解析組件引用。可能是調用方法或存取資料,載入器先查找引用組件,再載入,再 JIT 編譯所需 IL。
CLR 需載入組件時,先斷定載入哪個檔案。組件中繼資料包含對所有其他組件引用記錄,有強名稱與弱名稱之分。強名稱組件由四部分組成:組件名、版本號、文化特性(譯註:指區域性特定資訊,如關聯語言、子語言、國家/地區、日曆、區域慣例)、公開金鑰。若組件非強名稱,僅記錄組件名。強名稱組件不太可能被惡意元件取代。強組件可用組態檔對元件版本進行組態,是新還是舊。
確定正確組件後,CLR 斷定組件是否已在當前應用程式載入。是則用原有。否則繼續查找。強名稱組件先在全域組件快取 (GAC) 查找。不在 GAC,載入器檢查程式碼基底目錄組態檔,若存在則為唯一搜尋目錄。程式碼基底目錄無所需組件,載入失敗。
無直接程式碼基底目錄,載入器搜尋預設目錄集:
binPath,應用程式組態檔定義私有目錄,可與文化特性、組件名組合)。了解 CLR 載入機制有利於實際操作考慮如何建立更新元件。首先應用強名稱組件,記錄所有中繼資料。在 VS.NET 建立專案時,應填滿 assemblyInfo.cs 所有屬性,含完整版本號。這讓後續升級更簡單。VS.NET 在 assemblyInfo.cs 建立三部分:
[assembly: AssemblyTitle("My Assembly")]
[assembly: AssemblyDescription("This is the sample assembly")]
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyCompany("My company")]
[assembly: AssemblyProduct("It is part of a product")]
[assembly: AssemblyCopyright("Insert legal text here.")]
[assembly: AssemblyTrademark("More legal text")]
[assembly: AssemblyCulture("en-US")]
最後 AssemblyCulture 僅針對本地化組件。無本地化資源留空,否則遵循 RFC1766 標準填寫語言描述。接下來部分為版本號,VS.NET 記錄為:[assembly: AssemblyVersion("1.0.*")]