認識程式集 1 程式集的生成

2022-02-23 01:34:29 字數 2372 閱讀 8258

程式集(assembly)是.net程式的最小組成單位。每個程式集都有自己的名稱、版本等資訊。程式集通常表現為乙個檔案(.exe或.dll檔案),這樣的程式集被稱為單檔案程式集,這種程式集是最常見的。程式集也可以由多個檔案組成,每個檔案都是乙個模組檔案或者是乙個資源檔案,這樣的程式集被稱為多檔案程式集。下面來了解一下如何生成單檔案程式集和多檔案程式集。

1. 單檔案程式集的生成

這是最常見的程式集,使用 visual studio 只能生成單檔案程式集。使用 csc.exe 能夠很輕鬆地生成單檔案程式集:

上述命令執行後,會生成乙個名為 hello.dll 的檔案,該檔案組成了單檔案程式集。這個檔案是乙個託管模組,儲存了型別元資料和中間語言,還嵌入了資源檔案 hello.jpg 的內容(通過使用 /resource 選項)。型別元資料描述了模組中定義的型別及其成員,中間語言是編譯後的託管**。

程式集本身其實是乙個邏輯概念,對於自身的描述是通過程式集清單來實現的。程式集清單是一種元資料,描述了程式集的名稱、版本、區域性和強名稱資訊,還包括組成程式集的檔案的列表和資源資訊,以及其他資訊。在單檔案程式集中,程式集清單的元資料直接儲存在主模組檔案中。

在本例中,程式集中的名稱是hello,版本沒有提供,預設為0.0.0.0,區域性為語言中立,強名稱資訊為空,檔案列表只有hello.exe,託管資源為hello.jpg。

2. 多檔案程式集的生成

多檔案程式集比較少見,而且除了使用 csc.exe 之外,有時還需要使用 al.exe。假設有兩個源**檔案 a.cs 和 b.cs,我們有兩種生成多檔案程式集的方法,這兩種方法的主要區別在於程式集清單是儲存在某個模組中還是單獨儲存於主模組中。

先看第一種方法,只使用csc.exe就可以了:

csc.exe /target:module a.cs

csc.exe /target:library /addmodule.a.netmodule /out:hello.dll b.cs

第乙個命令將 a.cs 編譯為乙個模組檔案,a.netmodule,該檔案僅包含型別元資料和中間語言,不包含程式集清單,是一種「原始」的模組檔案,不能獨立存在,必須從屬於程式集。第二個命令將 b.cs 編譯成模組檔案,hello.dll。這個檔案除了包含型別元資料和中間語言之外,還儲存了程式集清單,因為成為主模組檔案。此時,程式集的名稱仍然為 hello,但檔案列表的內容變成了兩個:a.netmodule 和 hello.dll。

再來看第二種方法,需要使用 csc.exe 和 al.exe 兩個命令:

csc /target:module a.cs

csc /target:module b.cs

al.exe /target:library /out:hello.dll a.netmodule b.netmodule

前兩個命令將 a.cs 和 b.cs 編譯為兩個「原始」的模組檔案,a.netmodule 和 b.netmodule。第三個命令使用了al.exe(assembly linker,程式集鏈結器),該命令能夠將 a.netmodule 和 b.netmodule 組合到程式集中。這樣,最終會生成 hello.dll 這個主模組檔案,該檔案將僅包含程式集清單。在這個程式集清單中,檔案列表的內容變成了三個:a.netmodule,b.netmodule 和 hello.dll。

多檔案程式集不僅生成麻煩,而且應用似乎也不是很廣泛,因為對於clr來說,它只認識程式集,所以部署的時候,都是以程式集作為最小單位。一旦某個「原始」模組發生了改變,整個程式集都必須重新生成。另外,只有程式集有版本,模組作為程式集的組成部分,不能被版本化。

程式集內容

通常,靜態程式集可能由以下四個元素組成:

只有程式集清單是必需的,但也需要型別或資源來向程式集提供任何有意義的功能。

程式集中的這些元素有分組幾種方法。您可以將所有元素分組到單個物理檔案中,如下圖所示。

單檔案程式集

多檔案程式集

注意 構成多檔案程式集的那些檔案實際上並非由檔案系統來鏈結。它們而是通過程式集清單進行鏈結,公共語言執行庫將這些檔案作為乙個單元來管理。

在此插圖中,所有三個檔案均屬於乙個程式集,如 myassembly.dll 所包含的程式集清單檔案中所述。對於該檔案系統,這三個檔案是三個獨立的檔案。請注意,檔案 util.netmodule 被編譯為乙個模組,因為它不包含任何程式集資訊。在建立了程式集後,該程式集清單就被新增到 myassembly.dll,指示程式集與 util.net 模組和 graphic.bmp 的關係。

現在設計源**時,您會作出有關如何將應用程式的功能劃分到乙個或多個檔案的明確的決定。在設計 .net framework **時,您也將作出類似的決定,即如何將應用程式的功能劃分到乙個或多個程式集中。

使用CodeDom生成程式集

using system using microsoft.csharp using system.codedom.compiler using system.codedom namespace test.cui codesnippetcompileunit cu new codesnippetcom...

通過Roslyn動態生成程式集

之前寫過篇文章如何通過roslyn構建自己的c 指令碼,今天本來打算測試一下這部分api在新的版本中的變化,結果發現它的指令碼引擎找不到了,翻了一下官方文件,貌似說暫時性的移除了。便看了一下它動態生成程式集的api,這裡簡單的介紹一下使用方法。首先需要在nuget中新增codeanalysis的引用...

c 動態生成程式集dll

動態生成程式集,指定版本號,如果需要引用程式集,可以新增乙個類的 可以是個空類,也可以將一些檔案嵌入到dll裡。csharpcodeprovider codeprovider new csharpcodeprovider system.codedom.compiler.compilerparamet...