MSIL 組譯工具 (Ilasm.exe)
MSIL 組譯工具可以從 Microsoft Intermediate Language (MSIL) 中產生可移植的執行檔 (PE) (如需 MSIL 的詳細資訊,請參閱編譯為 MSIL)。您可以執行產生的可執行檔 (包含 MSIL 和所需的中繼資料),來判斷 MSIL 是否如預期般地執行。
ilasm [options] filename [[options]filename...]
參數
引數 | 說明 |
---|---|
filename |
.il 原始程式檔 (Source File) 的名稱。這個檔案由中繼資料 (Metadata) 宣告指示詞和符號 MSIL 指令組成。您可以提供多個原始程式檔引數來以 Ilasm.exe 產生單一 PE 檔。 |
選項 | 說明 | ||
---|---|---|---|
/alignment= integer |
將 FileAlignment 設定為 NT Optional 標頭中 integer 指定的值。如果在檔案中指定了 .alignment IL 指示詞,這個選項會覆寫它。 |
||
/base= integer |
將 ImageBase 設定為 NT Optional 標頭中 integer 指定的值。如果在檔案中指定了 .imagebase IL 指示詞,這個選項會覆寫它。 |
||
/clock |
對指定的 .il 原始程式檔以毫秒為單位測量並且報告下列編譯時間: 總共執行:執行所有緊接在後之特定作業所花費的總時間。 啟動:載入和開啟檔案。 發出 MD:發出中繼資料 (Metadata)。 定義參考解析:解析檔案中的定義參考。 產生 CEE 檔案:在記憶體中產生檔案映像。 撰寫 PE 檔案:撰寫 PE 檔案的映像。 |
||
/debug[=IMPL|OPT] |
包含偵錯資訊 (區域變數和引數名稱以及行號)。建立 PDB 檔案。 不帶其他值的 /debug 會停用 JIT 最佳化,並使用 PDB 檔案的序列點。 IMPL 會停用 JIT 最佳化,並使用隱含序列點。 OPT 會啟用 JIT 最佳化,並使用隱含序列點。 IMPL 和 OPT 是 .NET Framework 2.0 版的新功能。 |
||
/dll |
產生 .dll 檔做為輸出。 |
||
/enc=file |
從指定的原始程式檔 (Source File) 建立編輯後繼續差異。 .NET Framework 2.0 版的新功能。 |
||
/exe |
產生可執行檔做為輸出。此為預設值。 |
||
/flags= integer |
將 ImageFlags 設定為 Common Language Runtime 標頭中 integer 指定的值。如果在檔案中指定了 .corflags IL 指示詞,這個選項會覆寫它。如需 integer 有效值的清單,請參閱 CorHdr.h,COMIMAGE_FLAGS。 |
||
/fold |
將相同的方法主體摺疊為一。 .NET Framework 2.0 版的新功能。 |
||
/include=includePath |
設定路徑以搜尋與 #include 一起包含的檔案。 .NET Framework 2.0 版的新功能。 |
||
/itanium |
將 Intel Itanium 指定為目標處理器。 如果沒有指定映像 Bitness,則預設為 /pe64。 .NET Framework 2.0 版的新功能。 |
||
/key: keyFile |
使用 keyFile 包含的私密金鑰來編譯含有強式簽章的 filename。 |
||
/key:@ keySource |
使用在 keySource 產生的私密金鑰來編譯含有強式簽章的 filename。 |
||
/listing |
產生標準輸出上的清單檔。如果省略這個選項,將不會產生任何清單檔。 .NET Framework 2.0 (含) 以後版本不支援此參數。 |
||
/mdv=versionString |
設定中繼資料版本字串。 .NET Framework 2.0 版的新功能。 |
||
/msv=major.minor |
設定中繼資料流版本,其中 major 和 minor 是整數。 .NET Framework 2.0 版的新功能。 |
||
/noautoinherit |
沒有指定基底類別 (Base Class) 時,停用 Object 的預設繼承。 .NET Framework 2.0 版的新功能。 |
||
/nocorstub |
隱藏 CORExeMain Stub 的產生。 .NET Framework 2.0 版的新功能。 |
||
/nologo |
隱藏 Microsoft 程式啟始資訊顯示。 |
||
/output: file.ext |
指定輸出檔的名稱和副檔名。依預設值,輸出檔的名稱和第一個原始程式檔的名稱相同。預設副檔名是 .exe。如果指定 /dll 選項,預設副檔名會是 .dll。
|
||
/optimize |
將長指令最佳化為短指令。例如,br 變成 br.s。 .NET Framework 2.0 版的新功能。 |
||
/pe64 |
建立 64 位元的映像 (PE32+)。 如果沒有指定目標處理器,則預設為 /itanium。 .NET Framework 2.0 版的新功能。 |
||
/pdb |
在不啟用偵錯資訊追蹤的情況下建立 PDB 檔案。 .NET Framework 2.0 版的新功能。 |
||
/quiet |
指定安靜模式;不報告組譯碼 (Assembly) 程序。 |
||
/resource: file.res |
以 *.res 格式將指定的資源檔包含在結果的 .exe 或 .dll 檔中。使用 /resource 選項只能指定一個 .res 檔。 |
||
/stack=stackSize |
將 NT 選擇性標頭中的 SizeOfStackReserve 值設定為 stackSize。 .NET Framework 2.0 版的新功能。 |
||
/stripreloc |
指定不需要基底重新配置。 .NET Framework 2.0 版的新功能。 |
||
/subsystem= integer |
將子系統設定為 NT Optional 標頭中 integer 指定的值。如果在檔案中指定了 .subsystem IL 指示詞,這個命令會覆寫它。如需 integer 有效值的清單,請參閱 winnt.h,IMAGE_SUBSYSTEM。 |
||
/x64 |
將 64 位元的 AMD 處理器指定為目標處理器。 如果沒有指定映像 Bitness,則預設為 /pe64。 .NET Framework 2.0 版的新功能。 |
||
/? |
顯示工具的命令語法和選項。 |
注意事項 |
---|
所有 Ilasm.exe 的選項都不區分大小寫,並且是以前三個字母識別。例如,/lis 等同於 /listing,而 /res:myresfile.res 等同於 /resource:myresfile.res。指定引數的選項可接受在選項和引數之間的冒號 (:) 或等號 (=) 做為分隔符號。例如,/output:file.ext 等同於 /output=file.ext。 |
備註
MSIL 組譯工具協助工具廠商設計並實作 MSIL 產生器。使用 Ilasm.exe,工具與編譯器開發人員可以專注於 MSIL 和中繼資料的產生,而不需考慮以 PE 檔格式發出的 MSIL。
類似其他以執行階段為目標的編譯器 (例如 C# 和 Visual Basic),Ilasm.exe 並不會產生中繼目的檔 (Object File),而且不需要連結階段來形成 PE 檔。
MSIL 組譯工具可以表示所有現有的中繼資料和以執行階段為目標之程式語言的 MSIL 功能。這樣以任何這些程式語言所撰寫的 Managed 程式碼才能在 MSIL 組譯工具中適當被表示,並且以 Ilasm.exe 編譯。
您可以將 Ilasm.exe 和其附屬工具 Ildasm.exe 結合使用。Ildasm.exe 使用包含 MSIL 程式碼的 PE 檔做為輸入,並會建立可做為 Ilasm.exe 輸入的文字檔。這非常有用,例如在不支援所有執行階段中繼資料屬性的程式語言中編譯程式碼時。在編譯程式碼並透過 Ildasm.exe 執行輸出之後,可以手動編輯產生的 MSIL 文字檔來加入遺漏的屬性。然後可以透過 Ilasm.exe 執行這個文字檔來產生最後的可執行檔。
您也可以使用這項技術來由不同編譯器所原始產生的數個 PE 檔中產生單一 PE 檔。
注意事項 |
---|
目前您無法將這項技術用於包含內嵌機器碼的 PE 檔 (例如,由 Visual C++ 所產生的 PE 檔)。 |
為了讓 Ildasm.exe 和 Ilasm.exe 的組合運用盡可能精確,組譯工具不會執行某些簡單最佳化 - 它不會推斷是否使用指令的簡短或長格式。例如,工具不嘗試判斷它是否可以用簡短編碼方式來替代您可能寫入 MSIL 來源 (或可能由其他編譯器所發出) 的長編碼方式。如果您要簡短編碼方式,必須明確寫入該格式。不過,組譯工具不檢查有可能超過範圍的條件。
注意事項 |
---|
Ildasm.exe 只能在磁碟的檔案上作業。它無法在安裝於全域組件快取中的檔案上作業。 如需 MSIL 文法的詳細資訊,請參閱 .NET Framework SDK 中的 asmparse.grammar 檔。 |
範例
下列命令會組譯 MSIL 檔 myTestFile.il
,並產生可執行檔 myTestFile.exe.
。
ilasm myTestFile
下列命令會組譯 MSIL 檔 myTestFile.il
,並產生 .dll 檔 myTestFile.dll
。
ilasm myTestFile /dll
下列命令會組譯 MSIL 檔 myTestFile.il
,並產生 .dll 檔 myNewTestFile.dll
。
ilasm myTestFile /dll /output:myNewTestFile.dll
下列程式碼範例會顯示極為簡單的應用程式,將對主控台顯示 "Hello World!"。您可以編譯此程式碼,然後使用 Ildasm.exe 工具來產生 MSIL 檔案。
using System;
public class Hello
{
public static void Main(String[] args)
{
Console.WriteLine("Hello World!");
}
}
下列 MSIL 程式碼範例會對應至之前的 C# 程式碼範例。您可以使用 MSIL 組譯工具 (Ilasm.exe) 工具,將這個程式碼編譯為組件。MSIL 和 C# 這兩個程式碼範例都會對主控台顯示 "Hello World!"。
// Metadata version: v2.0.50215
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly sample
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module sample.exe
// MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x02F20000
// =============== CLASS MEMBERS DECLARATION ===================
.class public auto ansi beforefieldinit Hello
extends [mscorlib]System.Object
{
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello World!"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Hello::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Hello::.ctor
} // end of class Hello
請參閱
參考
.NET Framework 工具
MSIL 反組譯工具 (Ildasm.exe)
SDK 命令提示字元