C#/.NET程式集詳解

2020-07-16 10:04:46
在寫完程式碼之後進行生成(build)時,CLR 將 .NET 應用程式打包為由模組(module)組成的程式集(assembly)。

一個程式集由一或多個託管模組組成,程式程式碼被編譯為 IL 程式碼,存在於託管模組之中。

程式集是一個可以寄宿於 CLR 中的、擁有版本號的、自解釋、可設定的二進位制檔案,程式集的擴充套件名為 exe 或 dll。

程式集中的程式碼可以被其他程式集中的 C# 程式碼呼叫,例如幾乎所有的 C# 程式碼都會用到 mscorlib.dll 這個程式集中的物件。

程式集是自解釋的,因為它記錄了它需要存取的其他程式集(在清單中)。

另外,後設資料描述了程式集內部使用的型別的所有資訊,包括型別的成員和建構函式等。

程式集可以私有或共用的方式設定,如果以共用方式進行設定,則同一台機器的所有應用程式都可以使用它。

程式集也可以手動進行生成,這需要選擇對應語言的編譯器。

C# 的編譯器是csc.exe。可以通過 /t 引數指定編譯目標,最常見的幾個為:
  • /t:library:目標為一個 dll 檔案(需要指定託管模組)。
  • /t:exe:目標為一個可執行 exe 檔案,必須指定入口點。
  • /t:module:目標為一個託管模組。

其中,前兩個目標的結果檔案都是程式集,而最後一個目標的結果檔案是託管模組。

反向工程——使用 ILSpy 觀察 IL

ILSpy 是一個免費的、開源的反編譯工具,可以將程式集反編譯為 C# 程式碼。

ILSpy 的下載地址為:http://ilspy.net,和 .NET 自帶的 ildasm 相比,它有一個很大的優點,就是在開啟檔案之後,其他的程式仍然可以修改它。

使用 ildasm 開啟一個工程的 .dll 之後,你在 Visual Studio 就無法再生成它了(Visual Studio 會提示有其他程式正在使用),但 ILSpy 還不支援 C# 的較新版本的反編譯(不過,它正在與時俱進)。

我們平常將 C# 程式碼通過編譯器轉換為 IL 的動作叫做正向工程;而反過來,將程式集檔案內部的 IL 和後設資料重新組合併轉換為 C# 程式碼的動作就叫反向工程(reverse engineering)。

ILSpy 還允許在反向工程的同時,對某些語法關鍵字不進行反編譯,這將會生成一個較長的 C# 程式碼,但可以讓你更加清楚地了解編譯器幕後所做的工作(本書預設全部選擇), 如下圖所示。

ILSpy的選項