程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#第4章:創建基於二進制的組件(1)

Effective C#第4章:創建基於二進制的組件(1)

編輯:關於C語言

隨著類的數量增加,創建二進制的組件就變得很平常了:你想分離部分功能 。所有不同的是,二進制組件可以讓你獨立的保存這些離散的功能。創建的組件 程序集可以方便的共享邏輯,方便交叉語言 編程,以及方便布置。

在.Net程序就是組件包,每一個程序什麼樣可以隨時更新和發布。你應該已經知 道,基於程序集之間的應用程序是多麼容易更新呀,程序集之間的偶合是多麼好 呀! 最小偶合就是說更多的是減少了程序集之間復雜的依懶關系。同時也意味著 你可以簡單的更新小塊新 的程序集。這一章就是關於創建簡單易用,容易布置 ,以及容易更新的程序集。

.Net環境中的應用程序可以由多樣的二進制 組件組成。隨後,你可以獨立的更新這些組件,也就是可以在一個多程序集應用 程序中安裝與更新一個程序集。但你必須明白一件事,那就是CLR是如何發現和 載入這些程序集的。在你創建這些二進制組件時,你也就必須創建符合這些明確 期望的組件。接下來就介紹這一概念。

CLR並不會在程序啟動時加載全部 的引用程序集。更合適的作法是當運行時須要程序的成員時,加載器才解決程序 集的引用問題。這可能是調用一個方法或者訪問數據,加載器先查找引用的程序 集,然後加載它,然後JIT編譯須要的IL。

當CLR須要加載一個程序集時 ,先是斷定那個文件要加載。程序集的元數據包含了對所有其它程序集的引用記 錄,這個記錄有強名稱和弱名稱之分。一個強名稱(程序集)由四部分組成:程序 名,版本號,語言屬性(譯注:這裡的語言范指區域性特定的信息,如關聯的語 言、子語言、國家/地區、日歷和區域性約定),以及公開密鑰。如果程序集不是 一個強名稱程序,那麼就只記錄了程序集名。如果你的程序是一個強名稱程序集 ,那麼你的程序集就不太可能被一些惡意的組件(程序集)所取代。強程序集還可 以讓你用配置文件對組件的版本進行配置,是新的,還是先前的。

確定 正確的程序集以後,CLR接來就斷定這個程序集是否已經在當前的應用程序中加 載。如果是,就用原來的。如果不是,CLR就繼承查找程序集。如果程序是強名 稱的,CLR就先在全局程序緩存(GAC)中查找,如果不在GAC中,加載器就檢測代 碼目錄(codebase directory,譯注,這裡只是譯為代碼目錄,其實並不是源代 碼所在的目錄)中的配置文件,如果當前代碼目錄存在,那就是唯一被搜索程的 目錄了。如果在代碼目錄中沒有找到所要的程序集,那麼加載就失敗。

如果沒有直接的代碼目錄,加載器會搜索預先設定的目錄集:

* 應用程 序目錄。也就是與主應用程序集同在的位置。

* 語言目錄。這是一個在 應用程序目錄下的子目錄,這個目錄與當前語言名匹配。

* 程序集子目 錄。這是一個與程序集同名的子目錄,這兩個可以組合成這樣: [語言]/[程序 集名]

* 私有的運行目錄(binPath)。這是一個在應用程序配置文件中定 義的私有目錄。它同樣可以和語言和程序集名組合: [bin目錄]/[程序集名], 或者[bin目錄]/[語言], 還可以是:[bin目錄]/[語言]/[程序集名]。

從 這個討論中你應該明白三個內容:第一,只有強名稱程序集才能放到GAC中。其 次,你可以通過配置文件來修改默認的行為,從而升級程序中個別的強名稱程序 集。第三,強名稱程序集可以阻止對程序集的惡意篡改,從而提供更安全的應用 程序。

了解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