Ilasm.exe(MSIL 汇编程序)
更新:2011 年 4 月
MSIL 汇编程序从 Microsoft 中间语言 (MSIL) 生成可迁移可执行的 (PE) 文件。 (有关 MSIL 的更多信息,请参见托管执行过程。)可以运行结果可执行文件(该文件包含 MSIL 和所需的元数据)以确定 MSIL 是否按预期执行。
安装 Visual Studio 和 Windows SDK 时会自动安装此工具。 要运行工具,我们建议您使用 Visual Studio 命令提示符或 Windows SDK 命令提示符(也称 CMD Shell)。 您可以使用这些实用程序轻松运行工具,而不需要导航到安装文件夹。 有关更多信息,请参见 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)。
在命令提示处,键入下列命令:
ilasm [options] filename [[options]filename...]
参数
参数 |
说明 |
---|---|
filename |
.il 源文件的名称。 该文件包含元数据声明指令和符号化 MSIL 指令。 可以提供多个源文件参数,以便用 Ilasm.exe 生成一个 PE 文件。
注意
确保 .il 源文件中的最后一行代码具有结尾空白或行尾字符。
|
选项 |
说明 |
---|---|
/alignment=整数 |
将 FileAlignment 设置为由 NT Optional 标题中的 integer 指定的值。 如果在文件中指定了 .alignment IL 指令,则此选项将重写它。 |
/base=整数 |
将 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=整数 |
将 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。
注意
指定 /output:myfile.dll 并不会设置 /dll 选项。如果不指定 /dll,则会生成名为 myfile.dll 的可执行文件。
|
/optimize |
将长指令优化为短指令。 例如,将 br 优化为 br.s。 .NET Framework 2.0 版的新增功能。 |
/pe64 |
创建 64 位映像 (PE32+)。 如果未指定目标处理器,则默认值为 /itanium。 .NET Framework 2.0 版的新增功能。 |
/pdb |
创建 PDB 文件但不启用调试信息跟踪。 .NET Framework 2.0 版的新增功能。 |
/quiet |
指定安静模式;不报告程序集进度。 |
/资源:file.res |
在生成的 .exe 或 .dll 文件中包括 *.res 格式的指定资源文件。 使用 /resource 选项只能指定一个 .res 文件。 |
/stack=stackSize |
将 NT Optional 标头中的 SizeOfStackReserve 值设置为 stackSize。 .NET Framework 2.0 版的新增功能。 |
/stripreloc |
指定不需要基重定位。 .NET Framework 2.0 版的新增功能。 |
/subsystem=整数 |
将 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# 代码示例。 可使用 Ilasm.exe(MSIL 汇编程序) 工具将此代码编译为程序集。 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
请参见
参考
Visual Studio 和 Windows SDK 命令提示
概念
其他资源
修订记录
Date |
修订记录 |
原因 |
---|---|---|
2011 年 4 月 |
添加了有关使用 Visual Studio 和 Windows SDK 命令提示符的信息。 |
信息补充。 |