Share via


Ilasm.exe (MSIL 組譯工具)

更新:2011 年 4 月

MSIL 組譯工具可以從 Microsoft Intermediate Language (MSIL) 中產生可移植的執行檔 (PE) (如需 MSIL 的詳細資訊,請參閱Managed 執行程序)。您可以執行產生的可執行檔 (包含 MSIL 和所需的中繼資料),來判斷 MSIL 是否如預期般地執行。

這個工具會自動隨 Visual Studio 和 Windows SDK 一起安裝。 若要執行工具,建議您使用 Visual Studio 命令提示字元或 Windows SDK 命令提示字元。 這些公司可讓您輕鬆地執行工具,而不需瀏覽至安裝資料夾。 如需詳細資訊,請參閱Visual Studio 和 Windows SDK 命令提示字元

  • 如果您已經在電腦上安裝 Visual Studio:在工作列上,依序按一下 Start、All Programs、Visual Studio、Visual Studio Tools,然後按一下 Visual Studio Command Prompt。

    -或-

    如果您已經在電腦上安裝 Windows SDK:在工作列上,依序按一下 Start、All Programs、Windows SDK 的資料夾,然後按一下Command Prompt(或 CMD Shell)。

  • 在命令提示字元中輸入下列文字:

ilasm [options] filename [[options]filename...]

參數

引數

描述

filename

.il 原始程式檔 (Source File) 的名稱。 這個檔案由中繼資料 (Metadata) 宣告指示詞和符號 MSIL 指令組成。 您可以提供多個原始程式檔引數來以 Ilasm.exe 產生單一 PE 檔。

注意事項注意事項
確定 .il 原始程式檔中程式碼的最後一行具有尾端空白或行結尾字元。

選項

描述

/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 最佳化,並使用隱含序列點。

IMPLOPT 是 .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。

注意事項注意事項
指定 /output:myfile.dll 並不會設定 /dll 選項。如果沒有指定 /dll,結果將會是名稱為 myfile.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 編譯。

注意事項注意事項

如果 .il 原始程式檔中程式碼的最後一行沒有尾端空白字元或行結尾字元,編譯就可能會失敗。

您可以將 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 文法的詳細資訊,請參閱 Windows Software Development Kit (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# 程式碼範例。 您可以使用 Ilasm.exe (MSIL 組譯工具) 工具,將這個程式碼編譯為組件。 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

請參閱

參考

Ildasm.exe (MSIL 反組譯工具)

Visual Studio 和 Windows SDK 命令提示字元

概念

Managed 執行程序

其他資源

.NET Framework 工具

變更記錄

日期

記錄

原因

2011 年 4 月

加入使用 Visual Studio 和 Windows SDK 命令提示字元的相關資訊。

資訊加強。