更新:2007 年 11 月
MSIL 汇编程序从 Microsoft 中间语言 (MSIL) 生成可移植可执行的 (PE) 文件。(有关 MSIL 的更多信息,请参见 编译为 MSIL。)可以运行结果可执行文件(该文件包含 MSIL 和所需的元数据)以确定 MSIL 是否按预期执行。
ilasm [options] filename [[options]filename...]
参数
参数 |
说明 |
||
---|---|---|---|
filename |
.il 源文件的名称。该文件包含元数据声明指令和符号化 MSIL 指令。可以提供多个源文件参数,以便用 Ilasm.exe 生成一个 PE 文件。
|
选项 |
说明 |
||
---|---|---|---|
/alignment=integer |
将 FileAlignment 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .alignment IL 指令,则此选项将重写它。 |
||
/base=integer |
将 ImageBase 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件指定了 .imagebase IL 指令,则此选项将重写它。 |
||
/clock |
为指定的 .il 源文件测量并报告下列编译时间(以毫秒为单位): 总运行时间:执行后面的所有特定操作所花费的总时间。 启动:加载并打开文件。 发出 MD:发出元数据。 定义引用解析:解析对文件中的定义的引用。 CEE 文件生成:在内存中生成文件映像。 PE 文件写入:将映像写入 PE 文件。 |
||
/debug[=IMPL|OPT] |
包括调试信息(局部变量名和参数名以及行号)。创建 PDB 文件。 不带任何附加值的 /debug 禁用 JIT 优化,并使用 PDB 文件中的序列点。 IMPL 禁用 JIT 优化,并使用隐式序列点。 OPT 启用 JIT 优化,并使用隐式序列点。 IMPL 和 OPT 是 .NET Framework 2.0 版的新增功能。 |
||
/dll |
生成 .dll 文件作为输出。 |
||
/enc=file |
从指定的源文件创建“编辑并继续”增量。 此参数仅可用于教学目的,不支持商业使用。 .NET Framework 2.0 版的新增功能。 |
||
/exe |
生成可执行文件作为输出。这是默认设置。 |
||
/flags=integer |
将 ImageFlags 设置为由公共语言运行库标题中的 integer 指定的值。如果在文件中指定了 .corflags IL 指令,则此选项将重写它。有关 integer 的有效值的列表,请参见 CorHdr.h 中的 COMIMAGE_FLAGS。 |
||
/fold |
将相同的方法体合并为一体。 .NET Framework 2.0 版的新增功能。 |
||
/include=includePath |
设置要在其中搜索 #include 包含的文件的路径。 .NET Framework 2.0 版的新增功能。 |
||
/itanium |
指定 Intel 的 Itanium 作为目标处理器。 如果未指定映像位元,则默认值为 /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 |
当未指定基类时,禁用从 Object 的默认继承。 .NET Framework 2.0 版的新增功能。 |
||
/nocorstub |
取消生成 CORExeMain 存根。 .NET Framework 2.0 版的新增功能。 |
||
/nologo |
取消显示 Microsoft 启动标题。 |
||
/output:file.ext |
指定输出文件名和扩展名。默认情况下,输出文件名与第一个源文件名相同。默认扩展名为 .exe。如果指定 /dll 选项,则默认扩展名为 .dll。
|
||
/optimize |
将长指令优化为短指令。例如,将 br 优化为 br.s。 .NET Framework 2.0 版的新增功能。 |
||
/pe64 |
创建 64 位映像 (PE32+)。 如果未指定目标处理器,则默认值为 /itanium。 .NET Framework 2.0 版的新增功能。 |
||
/pdb |
创建 PDB 文件但不启用调试信息跟踪。 .NET Framework 2.0 版的新增功能。 |
||
/quiet |
指定安静模式;不报告程序集进度。 |
||
/resource:file.res |
在生成的 .exe 或 .dll 文件中包括 *.res 格式的指定资源文件。使用 /resource 选项只能指定一个 .res 文件。 |
||
/stack=stackSize |
将 NT Optional 标头中的 SizeOfStackReserve 值设置为 stackSize。 .NET Framework 2.0 版的新增功能。 |
||
/stripreloc |
指定不需要基重定位。 .NET Framework 2.0 版的新增功能。 |
||
/subsystem=integer |
将 subsystem 设置为由 NT Optional 标题中的 integer 指定的值。如果在文件中指定了 .subsystem IL 指令,则此命令将重写它。有关 integer 的有效值的列表,请参见 winnt.h 中的 IMAGE_SUBSYSTEM。 |
||
/x64 |
指定 64 位 AMD 处理器作为目标处理器。 如果未指定映像位元,则默认值为 /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 不产生中间对象文件,并且不需要链接阶段即可形成 PE 文件。
MSIL 汇编程序可以表达以运行库为目标的编程语言的所有现有元数据和 MSIL 功能。这使得用上面任何编程语言编写的托管代码都可以在 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 软件开发工具包 (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# 代码示例。可使用 MSIL 汇编程序 (Ilasm.exe) 工具将此代码编译为程序集。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