首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 第 4 章:建立基於二進制的元件(一)

     編輯:關於C語言

二進制元件與組件

隨類別數量增加,建立二進制元件成常態:想分離部分功能。不同處在於二進制元件可獨立保存離散功能。建立的組件組件可方便共享邏輯、跨語言程式設計、部署。

.NET 應用程式即組件包

.NET 程式即組件包,每個程式可隨時更新發布。基於組件間應用程式多麼容易更新,組件間耦合多麼好!最小耦合意謂減少組件間複雜依賴關係,也意味著可簡單更新小塊新組件。本章關於建立簡單易用、易部署、易更新的組件。

CLR 載入組件機制

.NET 環境應用程式可由多樣二進制元件組成。隨後可獨立更新這些元件,即在多組件應用程式中安裝更新單一組件。但必須明白 CLR 如何發現與載入組件。建立二進制元件時,必須建立符合明確期望的元件。

CLR 並不在程式啟動時載入所有引用組件。較適合做法:執行期需要程式成員時,載入器才解析組件引用。可能是調用方法或存取資料,載入器先查找引用組件,再載入,再 JIT 編譯所需 IL。

強名稱與弱名稱組件

CLR 需載入組件時,先斷定載入哪個檔案。組件中繼資料包含對所有其他組件引用記錄,有強名稱與弱名稱之分。強名稱組件由四部分組成:組件名、版本號、文化特性(譯註:指區域性特定資訊,如關聯語言、子語言、國家/地區、日曆、區域慣例)、公開金鑰。若組件非強名稱,僅記錄組件名。強名稱組件不太可能被惡意元件取代。強組件可用組態檔對元件版本進行組態,是新還是舊。

組件搜尋順序

確定正確組件後,CLR 斷定組件是否已在當前應用程式載入。是則用原有。否則繼續查找。強名稱組件先在全域組件快取 (GAC) 查找。不在 GAC,載入器檢查程式碼基底目錄組態檔,若存在則為唯一搜尋目錄。程式碼基底目錄無所需組件,載入失敗。

無直接程式碼基底目錄,載入器搜尋預設目錄集:

  • 應用程式目錄(主組件同位置)。
  • 文化特性目錄(應用程式目錄下子目錄,符合當前文化特性名)。
  • 組件子目錄(與組件同名子目錄,可組合:[文化特性]/[組件名])。
  • 私有執行目錄 (binPath,應用程式組態檔定義私有目錄,可與文化特性、組件名組合)。

三個關鍵結論

  1. 只有強名稱組件能放入 GAC。
  2. 可透過組態檔修改預設行為,升級程式中個別強名稱組件。
  3. 強名稱組件阻止惡意篡改,提供更安全應用程式。

實務建議

了解 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.*")]

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved