程序集 (CLI)
外觀
通用語言基礎架構 (CLI) 中的程序集,也譯作「裝配件」,是編譯得到的,供CLR進一步編譯執行的代碼庫。代碼是用通用中間語言(CIL)表示,在運行時被即時編譯為機器語言。在.NET Framework實現中,這種即時編譯是通用語言運行時 (CLR)的一部分。
CLI程序集可分為兩類:進程程序集(EXE)、庫程序集(DLL)。
一個程序集可包含一個或多個文件。代碼文件成為模塊(module)。
程序集名字
[編輯]程序集名字包括4部分:
- 短名字。對於Windows系統,是指PE文件名字,不包括文件擴展名。
- culture。RFC 1766定義的locale的標識符。一般應是culture中立的。culture只用於satellite程序集。
- 版本號。點分隔的數字,由4部分組成:major, minor, build, revision
- 公鑰token。公鑰的64比特哈希值,用於簽名[1]該程序集。一個簽名的程序集稱為「強名字」(strong name)。者能預防程序集重名。由於FAT32與NTFS只識別PE文件名,因此CLI引入了全局程序集緩存(GAC)處理運行時單個文件夾被映射為不同的嵌套的文件夾系統。
程序集版本
[編輯]CLI程序集可以用版本信息,以避免由於共享的程序集版本差別引起的應用程序衝突。[2] However, this does not eliminate all possible versioning conflicts between assemblies.[3]
引用程序集
[編輯]通過C#編譯器的/reference標記,可以引用一個可執行代碼庫。
程序集延遲簽名
[編輯]一個共享程序集是強名字的,但在開發時不產生私鑰,僅當部署時才產生私鑰。
程序集的語言
[編輯]程序集編譯為CIL代碼,這是一種中間語言。框架內部把CIL字節碼轉換為本地的匯編代碼。對於打印"Hello World"的程序,其等效的CIL代碼是:
.method private hidebysig static void Main(string[] args) cil managed {
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 11 (0xb)
.maxstack 1
IL_0000: ldstr "Hello World"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret } // end of method Class1::Main
CIL代碼裝入String到運行棧,然後調用WriteLine函數再返回。
參見
[編輯]參考文獻
[編輯]- ^ Giving a .NET Assembly a Strong Name. [2019-07-04]. (原始內容存檔於2012-02-24).
- ^ Truche, Philippe. .NET Assembly Versioning Lifecycle. 2008-08-12 [2008-09-21]. (原始內容存檔於24 October 2008).
- ^ Pierson, Harry. DLR Namespace Change Fire Drill. 2008-09-17 [2008-09-21]. (原始內容存檔於1 November 2008).