在寫完程式碼之後進行生成(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# 程式碼,但可以讓你更加清楚地了解編譯器幕後所做的工作(本書預設全部選擇), 如下圖所示。