如何查看程序集内容

可以使用 Ildasm.exe(IL 反汇编程序) 查看文件中的公共中间语言(CIL)信息。 如果所检查的文件是程序集,则此信息可以包含程序集的属性和对其他模块和程序集的引用。 此信息有助于确定文件是程序集还是程序集的一部分,以及该文件是否引用其他模块或程序集。

若要使用 Ildasm.exe显示程序集的内容,请在命令提示符处输入 ildasm <程序集名称> 。 例如,以下命令反汇编 Hello.exe 代码。

ildasm Hello.exe

若要查看程序集清单信息,请双击 IL 反汇编程序窗口中的 “清单 ”图标。

示例:

以下示例以基本的“Hello World”程序开头。 编译程序后,使用 Ildasm.exe 来反汇编 Hello.exe 程序集并查看程序集清单。

using System;

class MainApp
{
    public static void Main()
    {
        Console.WriteLine("Hello World using C#!");
    }
}
Class MainApp
    Public Shared Sub Main()
        Console.WriteLine("Hello World using Visual Basic!")
    End Sub
End Class

Hello.exe 程序集上运行命令 ildasm.exe,并在 IL 反汇编程序窗口中双击“清单”图标将生成以下输出:

// Metadata version: v4.0.30319
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly Hello
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
                                                                                                             63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module Hello.exe
// MVID: {7C2770DB-1594-438D-BAE5-98764C39CCCA}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x00600000

下表描述了示例中使用的 Hello.exe 程序集的程序集清单中的每个指令:

指令 DESCRIPTION
.assembly extern <程序集名称> 指定另一个程序集,其中包含当前模块引用的项(在本例中)。 mscorlib
.publickeytoken <令牌> 指定所引用程序集的实际密钥的标记。
.ver <版本号> 指定所引用程序集的版本号。
.assembly <程序集名称> 指定程序集名称。
.hash 算法 <int32 数值> 指定使用的哈希算法。
.ver <版本号> 指定程序集的版本号。
.module <文件名> 指定组成程序集的模块的名称。 在此示例中,程序集仅包含一个文件。
.subsystem <值> 指定程序所需的应用程序环境。 在此示例中,值 3 指示此可执行文件是从控制台运行的。
.corflags 当前是元数据中的保留字段。

程序集清单可以包含许多不同的指令,具体取决于程序集的内容。 有关程序集清单中指令的广泛列表,请参阅 Ecma 文档,特别是“分区 II:元数据定义和语义”和“Partition III: CIL 指令集”:

另请参阅