MSIL 反汇编程序 (Ildasm.exe)
更新:2007 年 11 月
MSIL 反汇编程序是 MSIL 汇编程序 (Ilasm.exe) 的伙伴工具。Ildasm.exe 采用包含 Microsoft 中间语言 (MSIL) 代码的可移植可执行 (PE) 文件,并创建相应的文本文件作为 Ilasm.exe 的输入。
ildasm [options] [PEfilename] [options]
参数
下列选项可用于 .exe、.dll、.obj 和 .lib 文件。
选项 |
说明 |
---|---|
/output=filename |
创建具有指定 filename 的输出文件,而不是在图形用户界面中显示结果。 |
/rtf |
以 RTF 格式生成输出。与 /text 选项一起使用则无效。 .NET Framework 2.0 版的新增功能。 |
/text |
将结果显示到控制台窗口,而不是显示在图形用户界面中或显示为输出文件。 |
/html |
以 HTML 格式生成输出。与 /output 选项一起使用时才有效。 .NET Framework 2.0 版的新增功能。 |
/? |
显示此工具的命令语法和选项。 |
下列附加选项可用于 .exe 和 .dll 文件。
选项 |
说明 |
---|---|
/bytes |
以十六进制格式显示作为指令注释的实际字节。 |
/caverbal |
以文字形式生成自定义属性 Blob。默认为二进制形式。 .NET Framework 2.0 版的新增功能。 |
/linenum |
包含对原始源行的引用。 |
/nobar |
取消反汇编进度指示器弹出窗口的显示。 |
/noca |
禁止显示自定义属性的输出。 .NET Framework 2.0 版的新增功能。 |
/pubonly |
只反汇编公共类型和公共成员。等效于 /visibility:PUB。 |
/quoteallnames |
在单引号中包含所有名称。 |
/raweh |
以原始格式显示异常处理子句。 |
/source |
显示作为注释的原始源行。 |
/tokens |
显示类和成员的元数据标记。 |
/visibility:vis [+vis ...] |
只反汇编具有指定可见性的类型或成员。以下是 vis 的有效值: PUB -- Public PRI -- Private FAM -- Family ASM -- Assembly FAA -- Family 和 Assembly FOA -- Family 或 Assembly PSC -- Private Scope 有关这些可见性修饰符的定义,请参见 MethodAttributes 和 TypeAttributes。 |
下列选项仅对用于文件或控制台输出的 .exe 和 .dll 文件有效。
选项 |
说明 |
||
---|---|---|---|
/all |
指定 /header、/bytes、/stats、/classlist 和 /tokens 选项的组合。
|
||
/classlist |
包含模块中定义的类的列表。 .NET Framework 2.0 版的新增功能。 |
||
/forward |
使用前向类声明。 .NET Framework 2.0 版的新增功能。 |
||
/header |
在输出中包含文件头信息。 |
||
/item:class[::member[(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] |
显示元数据,其中 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 中和解释输出的详细指南,请参见 Windows 软件开发工具包 (SDK) 附带的 Samples 文件夹中的 Ildasm.exe 教程。
如果用包含嵌入资源的 PEfilename 参数提供 Ildasm.exe,则此工具生成多个输出文件:一个包含 MSIL 代码的文本文件,而每个嵌入的托管资源都有一个用该资源在元数据中的名称生成的 .resources 文件。如果 PEfilename中有嵌入的非托管资源,则用 /output 选项为 MSIL 输出指定的文件名生成 .res 文件。
说明: |
---|
Ildasm.exe 只显示 .obj 和 .lib 输入文件的元数据说明。不反汇编这些文件类型的 MSIL 代码。 |
可以对 .exe 或 .dll 文件运行 Ildasm.exe 来确定该文件是否是托管的。如果该文件不是托管的,则此工具将显示一条信息,说明该文件不包含有效的公共语言运行库头,并且无法反汇编。如果该文件是托管的,则此工具将成功运行。
示例
下面的命令使 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 包含嵌入的托管和非托管资源,则下面的命令将产生以下 4 个文件: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 且参数类型为 int32 和 string 的 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。