IL 反汇编程序是 IL 汇编程序 (Ilasm.exe) 的配套工具。 Ildasm.exe 可利用包含中间语言 (IL) 代码的可移植可执行 (PE) 文件,并创建适合输入到 Ilasm.exe 的文本文件 。
此工具会自动随 Visual Studio 一起安装。 若要运行该工具,请使用 Visual Studio 开发人员命令提示或 Visual Studio 开发人员 PowerShell。
在命令提示符处,键入以下内容:
语法
ildasm [options] [PEfilename] [options]
参数
下列选项可用于 .exe、.dll、.obj、.lib 和 .winmd 文件 。
| 选项 | 说明 |
|---|---|
/out= filename |
创建具有指定 filename 的输出文件,而不是在图形用户界面中显示结果。 |
| /rtf | 以 RTF 格式生成输出。 与 /text 选项一起使用时无效。 |
| /text | 将结果显示到控制台窗口,而不是显示在图形用户界面中或显示为输出文件。 |
| /html | 以 HTML 格式生成输出。 与 /output 选项一起使用时才有效。 |
| %> | 显示此工具的命令语法和选项。 |
下列附加选项可用于 .exe、.dll 和 .winmd 文件 。
| 选项 | 说明 |
|---|---|
| /bytes | 以十六进制格式显示作为指令注释的实际字节。 |
| /caverbal | 以文字形式生成自定义特性 Blob。 默认为二进制形式。 |
| /linenum | 包含对原始源行的引用。 |
| /nobar | 禁止显示反汇编进度指示器弹出窗口。 |
| /noca | 禁止显示自定义特性的输出。 |
| /project | 以托管代码的方式显示元数据,而不是以本机 Windows 运行时的方式显示。 如果 PEfilename 不是 Windows 元数据 (.winmd) 文件,此选项将不起任何作用。 请参阅 Windows 应用商店应用和 Windows 运行时的 .NET Framework 支持。 |
| /pubonly | 仅反汇编公共类型和公共成员。 等效于 /visibility:PUB。 |
| /quoteallnames | 在单引号中包含所有名称。 |
| /raweh | 以原始格式显示异常处理子句。 |
| /source | 以注释形式显示原始源行。 |
| /tokens | 显示类和成员的元数据标记。 |
/visibility: [+vis...]vis |
仅反汇编具有指定可见性的类型或成员。 下面是 vis 的有效值:PUB — 公共PRI — 专用FAM — 家庭ASM — 程序集FAA — 系列和程序集FOA — 系列或程序集PSC — 专用范围有关这些可见性修饰符的定义,请参见 MethodAttributes 和 TypeAttributes。 |
下列选项仅对用于文件或控制台输出的 .exe、.dll 和 .winmd 文件有效 。
| 选项 | 说明 |
|---|---|
| /all | 指定 /header、/bytes、/stats、/classlist 和 /tokens 选项的组合 。 |
| /classlist | 包含模块中定义的类的列表。 |
| /forward | 使用前向类声明。 |
| /headers | 在输出中包含文件头信息。 |
/item: [:: class[]]member(sig |
根据所提供的自变量反汇编下列内容: - 对指定的 class 进行反汇编。- 对 member 的指定的 class 进行反汇编。- 对具有指定签名 member 的 class 的 sig 进行反汇编。
sig 的格式如下:[ instance] returnType(parameterType1,, parameterType2..., parameterTypeN)。 |
| /noil | 禁止显示 IL 程序集代码输出。 |
| /stats | 包含映像的统计信息。 |
| /typelist | 生成类型的完整列表,以便在往返过程中保留类型排序。 |
| /unicode | 对输出使用 Unicode 编码。 |
| /utf8 | 对输出使用 UTF-8 编码。 ANSI 为默认值。 |
下列选项仅对用于文件或控制台输出的 .exe、.dll、.obj、.lib 和 .winmd 文件有效 。
| 选项 | 说明 |
|---|---|
| /metadata[=] | 显示元数据,其中 specifier 为:MDHEADER — 显示元数据标头信息和大小。HEX - 用十六进制和字词显示信息。CSV — 显示记录计数和堆大小。UNREX — 显示未解析的外部。SCHEMA — 显示元数据标头和架构信息。RAW — 显示原始元数据表。HEAPS — 显示原始堆。VALIDATE — 验证元数据的一致性。可多次指定 /metadata,并为 指定不同的值。 |
下列选项仅对用于文件或控制台输出的 .lib 文件有效。
| 选项 | 说明 |
|---|---|
| /objectfile= | 显示指定库中单个对象文件的元数据。 |
备注
Ildasm.exe 的所有选项都不区分大小写,并且根据前三个字母识别。 例如,/quo 等效于 /quoteallnames 。 指定参数的选项既可以用冒号 (:) 也可以用等号 (=) 作为选项和参数之间的分隔符。 例如,/output: filename 等效于 /output= filename。
注解
Ildasm.exe 只对磁盘上的 PE 文件进行操作。 它不对安装在全局程序集缓存中的文件进行操作。
Ildasm.exe 生成的文本文件可以用作 IL 汇编程序 (Ilasm.exe) 的输入 。 这很有用,例如在编译用并非支持所有运行时元数据特性的编程语言编写的代码时。 通过 Ildasm.exe 编译代码并运行其输出后,可以手动编辑生成的 IL 文本文件以添加缺少的属性。 然后可以通过 IL 汇编程序运行此文本文件以生成最终可执行文件。
备注
目前,无法对包含嵌入的本机代码的 PE 文件(例如,由 Visual C++ 生成的 PE 文件)使用此技术。
你可以使用 IL 反汇编程序中的默认 GUI 在分层树视图中查看任何现有 PE 文件的元数据和反汇编代码。 若要使用 GUI,请在命令行中键入 ildasm ,而无需提供 PEfilename 参数或任何选项。
File从菜单中,可以导航到要加载到 Ildasm.exe的 PE 文件。 若要保存为所选 PE 显示的元数据和反汇编代码, Dump 请从 File 菜单中选择该命令。 若要仅保存分层树视图,请从File菜单中选择“转储树视图”命令。 有关将文件加载到 Ildasm.exe 中和解释输出的详细指南,请参见 Windows SDK 附带的 Samples 文件夹中的 Ildasm.exe 教程 。
如果为 Ildasm.exe 提供一个包含嵌入资源的 PEfilename 参数,则此工具生成多个输出文件:一个包含 IL 代码的文本文件,以及与每个嵌入的托管资源对应的 .resources 文件(使用该资源在元数据中的名称生成) 。 如果 PEfilename 中嵌入了非托管资源,则通过 /output 选项使用 IL 输出指定的文件名生成 .res 文件。
备注
Ildasm.exe 仅显示 .obj 和 .lib 输入文件的元数据说明 。 不反汇编这些文件类型的 IL 代码。
可对 .exe 或 .dll 文件运行 Ildasm.exe 来确定该文件是否是托管的 。 如果该文件不是托管的,则此工具将显示一条信息,说明该文件没有有效的公共语言运行时标头,并且无法反汇编。 如果该文件是托管的,则此工具将成功运行。
版本信息
从 .NET Framework 4.5 开始,Ildasm.exe 将通过显示原始二进制内容来处理无法识别的封送 BLOB(二进制大型对象)。 例如,下面的代码演示 C# 程序生成的封送 BLOB 如何显示:
public void Test([MarshalAs((short)70)] int test) { }
// IL from Ildasm.exe output
.method public hidebysig instance void Test(int32 marshal({ 46 }) test) cil managed
从 .NET Framework 4.5 开始,Ildasm.exe 将显示应用于接口实现的属性,如下方 Ildasm.exe 输出摘录所示:
.class public auto ansi beforefieldinit MyClass
extends [mscorlib]System.Object
implements IMyInterface
{
.interfaceimpl type IMyInterface
.custom instance void
[mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )
…
示例
下面的命令使 PE 文件 MyHello.exe 的元数据和反汇编代码显示在 Ildasm.exe 的默认 GUI 中。
ildasm myHello.exe
下面的命令对 MyFile.exe 文件进行反汇编,并将生成的 IL 汇编程序文本存储在 MyFile.il 文件中。
ildasm MyFile.exe /output:MyFile.il
下面的命令对 MyFile.exe 文件进行反汇编,并将结果 IL 汇编程序文本显示到控制台窗口中。
ildasm MyFile.exe /text
如果文件 MyApp.exe 包含嵌入的托管和非托管资源,则下面的命令将生成 4 个文件:MyApp.il、MyApp.res、Icons.resources 和 Message.resources :
ildasm MyApp.exe /output:MyApp.il
下面的命令对 MyMethod 的 MyClass 类中的 MyFile.exe 方法进行反汇编,并将输出显示到控制台窗口中。
ildasm /item:MyClass::MyMethod MyFile.exe /text
在上面的示例中,可能有几个具有不同签名的名为 MyMethod 的方法。 以下命令使用返回类型和void参数类型和参数类型int32string反汇编实例方法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)的类类型必须包括命名空间并且必须在前面加上关键字 class。 外部类型的前面必须是用方括号括起来的库名称。 下面的命令对名为 MyMethod 的静态方法进行反汇编,该方法具有一个 AppDomain 类型的参数且其返回类型为 AppDomain。
ildasm /item:"MyClass::MyMethod(class [mscorlib]System.AppDomain(class [mscorlib]System.AppDomain)" MyFile.exe /text
嵌套类型的前面必须是包含它的类,并用正斜杠进行分隔。 例如,如果 MyNamespace.MyClass 类包含名为 NestedClass 的嵌套类,则按如下方式标识该嵌套类:class MyNamespace.MyClass/NestedClass。