共用方式為


Ildasm.exe (MSIL 反組譯工具)

更新:2011 年 4 月

MSIL 反組譯工具是 MSIL 組譯工具 (Ilasm.exe) 的附屬工具。 Ildasm.exe 使用包含 Microsoft Intermediate Language (MSIL) 程式碼之可移植的執行檔 (PE),並建立可以做為 Ilasm.exe 之輸入檔的文字檔。

這個工具會自動隨 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)。

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

ildasm [options] [PEfilename] [options]

參數

下列選項可用於 .exe、.dll、.obj 和 .lib 檔。

選項

描述

/out=filename

建立具有指定 filename 的輸出檔,而非在圖形化使用者介面中顯示結果。

/rtf

以 Rich Text Format (.rtf 檔案) 產生輸出。 使用 /text 選項時無效。

.NET Framework 2.0 版的新功能。

/text

顯示結果到主控台 (Console) 視窗,而非在圖形化使用者介面中顯示或做為輸出檔。

/html

以 HTML 格式產生輸出。 僅使用 /output 選項時才有效。

.NET Framework 2.0 版的新功能。

/?

顯示工具的命令語法和選項。

下列額外的選項可用於 .exe 和 .dll 檔。

選項

描述

/bytes

以十六進位格式顯示實際位元組做為指令註解。

/caverbal

以動詞化格式產生自訂屬性 BLOB (二進位大型物件)。 預設為二進位格式。

.NET Framework 2.0 版的新功能。

/linenum

包含原始程式行的參考。

/nobar

隱藏反組譯碼進度指示器快顯視窗 (Pop-Up Window)。

/noca

隱藏自訂屬性的輸出。

.NET Framework 2.0 版的新功能。

/pubonly

僅反組譯公用型別和成員。 等同於 /visibility:PUB

/quoteallnames

在單引號內包含所有的名稱。

/raweh

以未經處理格式顯示例外處理 (Exception Handling) 子句。

/source

顯示原始程式行做為註解。

/tokens

顯示類別和成員的中繼資料語彙基元 (Token)。

/visibility:vis[+vis...]

以指定的可視性僅反組譯型別或成員。 下列都是 vis 的有效值:

PUB — Public

PRI — Private

FAM — Family

ASM — Assembly

FAA — Family 和 Assembly

FOA — Family 或 Assembly

PSC — Private Scope

如需這些可視性修飾詞 (Modifier) 的定義,請參閱 MethodAttributesTypeAttributes

下列選項對 .exe 和 .dll 檔有效,僅適用於檔案或主控台輸出。

選項

描述

/all

指定 /header/bytes/stats/classlist/tokens 選項的組合。

注意事項注意事項
在 .NET Framework 1.0 和 1.1 版中,指定 /header/bytes/tokens 選項的組合。

/classlist

包括在模組中定義的類別清單。

.NET Framework 2.0 版的新功能。

/forward

使用 forward 類別宣告。

.NET Framework 2.0 版的新功能。

/headers

在輸出中包含檔頭資訊。

/item:class[::member[(sig]]

根據提供的引數反組譯下列項目:

  • 反組譯指定的 class

  • 反組譯指定之 class 的 member。

  • 以指定的簽章 sig 反組譯類別的member。 sig 的格式為:

    [instance] returnType(parameterType1, parameterType2, …, parameterTypeN)

    注意:在 .NET Framework 1.0 和 1.1 版中,sig 後面必須接上右括號:(sig)。 在 2.0 版中,則一定會省略右括號:(sig。

/noil

隱藏 MSIL 組譯碼輸出。

/stats

包括映像的統計資料。

.NET Framework 2.0 版的新功能。

/typelist

產生型別完整清單,以保留來回之間的型別順序。

.NET Framework 2.0 版的新功能。

/unicode

輸出使用 Unicode 編碼方式。

/utf8

輸出使用 UTF-8 編碼方式。 ANSI 是預設值。

下列選項對 .exe、.dll、.obj 和 .lib 檔有效,僅適用於檔案或主控台輸出。

選項

描述

/metadata[=specifier]

顯示中繼資料 (Metadata),其中 specifier 是:

MDHEADER — 顯示中繼資料的標頭資訊和大小。

HEX — 使用十六進位和文字顯示資訊。

CSV — 顯示記錄計數和堆積大小。

UNREX — 顯示無法解析的外部符號。

SCHEMA — 顯示中繼資料的標頭和結構描述資訊。

RAW — 顯示原始中繼資料的表格。

HEAPS — 顯示原始的堆積。

VALIDATE — 驗證中繼資料的一致性。

您可以多次指定 /metadata,每次使用不同的 specifier 值。

.NET Framework 2.0 版的新功能。

下列選項只對適用於檔案或主控台輸出的 .lib 檔有效。

選項

描述

/objectfile=filename

在指定的程式庫中顯示單一物件檔案的中繼資料。

.NET Framework 2.0 版的新功能。

注意事項注意事項

所有 Ildasm.exe 的選項都不區分大小寫,並且是以前三個字母識別。例如,/quo 就相當於 /quoteallnames。指定引數的選項可以接受冒號 (:) 或等號 (=) 做為選項與引數之間的分隔符號。例如,/output:filename 等同於 /output=filename

備註

Ildasm.exe 只在磁碟上的 PE 檔上作業。 它無法在安裝於全域組件快取中的檔案上作業。

Ildasm.exe 所產生的文字檔可以被用來做為 MSIL 組譯工具 (Ilasm.exe) 的輸入。 這非常有用,例如在不支援所有執行階段中繼資料屬性的程式語言中編譯程式碼時。 在編譯程式碼並透過 Ildasm.exe 執行其輸出之後,可以手動編輯產生的 MSIL 文字檔來加入遺漏的屬性。 然後可以透過 MSIL 組譯工具執行這個文字檔來產生最後的可執行檔。

注意事項注意事項

目前您無法將這項技術用於包含內嵌機器碼的 PE 檔 (例如,由 Visual C++ 所產生的 PE 檔)。

您可以使用 MSIL 反組譯工具中的預設 GUI,來檢視在階層式樹狀檢視中任何現有 PE 檔的中繼資料和反組譯碼。 若要使用 GUI,請在命令列輸入 ildasm,但不提供 PEfilename 引數或任何選項。 從 [檔案] 功能表,您可以瀏覽至要載入 Ildasm.exe 的 PE 檔案。 若要儲存所選 PE 顯示的中繼資料和反組譯程式碼,請選取 [檔案] 功能表中的 [傾印]。 若只要儲存階層式樹狀檢視,請從 [檔案] 功能表中選取 [傾印樹狀檢視] 命令。 如需將檔案載入至 Ildasm.exe 和解譯輸出的詳細指引,請參閱<Ildasm.exe 教學課程>,該教學課程位於 Windows Software Development Kit (SDK) 隨附的 Samples 資料夾中。

如果您提供 Ildasm.exe 和包含內嵌資源的 PEfilename 引數,這個工具就會產生多個輸出檔案:包含 MSIL 程式碼的文字檔,以及對每個內嵌的 Managed 資源,使用來自中繼資料 (Metadata) 的資源名稱所產生的 .resources 檔。 如果 Unmanaged 資源是內嵌於 PEfilename,.res 檔是使用由 /output 選項輸出的 MSIL 的指定檔名所產生。

注意事項注意事項

Ildasm.exe 僅會顯示 .obj 和 .lib 輸入檔的中繼資料描述。這些檔案類型的 MSIL 程式碼是不被反組譯的。

您可以在 .exe 或 .dll 檔上執行 Ildasm.exe 來判斷這個檔案是否為 Managed。 如果這個檔案不是 Managed,工具便會顯示訊息,說明這個檔案沒有有效的 Common Language Runtime 標頭而且無法反組譯。 如果這個檔案是 Managed,工具就會順利執行。

範例

下列命令會使得 PE 檔 MyHello.exe 的中繼資料和反組譯的程式碼顯示在 Ildasm.exe 的預設 GUI 中。

ildasm myHello.exe

下列命令會反組譯 MyFile.exe 檔案,並將產生的 MSIL 組譯工具文字儲存到 MyFile.il 檔案。

ildasm MyFile.exe /output:MyFile.il

下列命令會反組譯 MyFile.exe 檔案,並將產生的 MSIL 組譯工具文字顯示到主控台視窗。

ildasm MyFile.exe /text

如果檔案 MyApp.exe 含有內嵌 Managed 和 Unmanaged 資源,則下列命令會產生四個檔案:MyApp.il、MyApp.res、Icons.resources, 和 Message.resources:

ildasm MyApp.exe /output:MyApp.il

下列命令會反組譯 MyFile.exe 中類別 MyClass 內的方法 MyMethod,並且將輸出顯示到主控台視窗。

ildasm /item:MyClass::MyMethod MyFile.exe /text

在上述範例中,可能有好幾個名為 MyMethod 但卻具有不同簽章的方法。 下列命令會以 void 的傳回型別,以及 int32string 的參數型別,反組譯執行個體 (Instance) 方法 MyMethod。

ildasm /item:"MyClass::MyMethod(instance void(int32,string)" MyFile.exe /text
注意事項注意事項

在 .NET Framework 1.0 和 1.1 版中,方法名稱後的左括號必須與簽章後的右括號保持對稱:MyMethod(instance void(int32))。在 .NET Framework 2.0 版中,則一定會省略右括號:MyMethod(instance void(int32)。

若要擷取 static 方法 (Visual Basic 中的 Shared 方法),請省略關鍵字 instance。 非 int32 和 string 等基本型別 (Primitive Type) 的類別型別,都必須包含命名空間 (Namespace),而且在其之前必須搭配關鍵字 class。 外部型別的前面必須是以方括號括住的程式庫名稱。 下列命令會反組譯名為 MyMethod 的靜態 (Static) 方法,此方法具有一個 AppDomain 型別的參數以及 AppDomain 的傳回型別。

ildasm /item:"MyClass::MyMethod(class [mscorlib]System.AppDomain(class [mscorlib]System.AppDomain)" MyFile.exe /text

巢狀型別的前面必須是它的包含類別,並以正斜線分隔。 例如,如果 MyNamespace.MyClass 類別包含名為 NestedClass 的巢狀類別,該巢狀類別就會識別如下:class MyNamespace.MyClass/NestedClass。

請參閱

參考

Ilasm.exe (MSIL 組譯工具)

Visual Studio 和 Windows SDK 命令提示字元

概念

Managed 執行程序

其他資源

.NET Framework 工具

變更記錄

日期

記錄

原因

2011 年 4 月

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

資訊加強。