.NET 中间语言 (IL) 简要介绍





3.00/5 (4投票s)
2001年9月3日
3分钟阅读

65383
直接使用 IL 的简单示例
引言
要编译和运行代码,您必须安装 Microsoft .NET Framework Beta 2。 可以在 http://msdn.Microsoft.com 下载此版本。
当我收到 Visual Studio .NET Beta 2 的副本时,我没有找到 beta 1 中包含的 ILAssemblyLanguageProgrammersReference.doc,所以我决定与其他的汇编爱好者分享我的经验。 对中间语言感兴趣的其他文档可以在“C:\Program Files\Microsoft.NET\FrameworkSDK\Tool Developers Guide\docs”中找到。
技巧
通常,您会从命令行使用记事本来处理汇编器。 要在任何目录中打开命令行,请在“HKEY_CLASSES_ROOT\Folder\shell”中创建一个注册表项(键),名为“CmdLine
”,并在 CmdLine
中添加一个名为“command
”的新条目。 将 (Default) 更改为 string
值 REG_SZ
,设置为“cmd.exe %1
”。 这允许您使用上下文菜单(右键单击文件夹图标并选择 CmdLine
)打开命令行。 此外,在“C:\Documents and Settings\whatever your name is\SendTo”中为 Notepad.exe 和 ildasm.exe 创建快捷方式也很方便,这样可以将 .il 文件发送到记事本,将 .exe 文件发送到反汇编器。
一个示例 IL 文件
首先,我们将编写一个客户端,并从客户端向 ArgIn.dll(我们将创建下面的库)发送一个 string
,该库将在消息框中显示我们的 string
。 复制以下内容,将其粘贴到记事本中,并将其保存为 client.il
.assembly extern mscorlib{}
.assembly extern ArgIn{}
.assembly go{}
.method public static void GO2() cil managed //any name starting with letter is ok
{
.entrypoint //must
.maxstack 1
//you can safely comment out .maxstack 1 or set it to 2, but if it is
// insufficient it results in a run-time error
.locals ([0] class [ArgIn]ArgIn.Class1 q)
//.locals [init] ( <localsSignature> ) Defines a set of local variables for this method.
ldstr "Hello from client"
//72 <T> ldstr string push a string object for the literal string
newobj instance void [ArgIn]ArgIn.Class1::.ctor(string)
//73 <T> newobj ctor allocate an uninitialized object and call ctor
stloc.0
//0A stloc.0 Pop value from stack into local variable 0.
// pop will also do here (we won't use it again)
ret //return is a must
}
现在不要编译。 首先,我们必须编译库。 以下是我们要编译到 ArgIn.dll 的库
.assembly extern mscorlib
{}
.assembly extern System.Windows.Forms
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 1:0:2411:0
}
.assembly ArgIn
{}
.namespace ArgIn
{
.class public auto ansi beforefieldinit Class1
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor(string msg) cil managed
{
//.maxstack 8
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ldarg.1
ldstr "From dll"
call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult
[System.Windows.Forms]System.Windows.Forms.MessageBox::Show
(string,string)
pop
ret
}
}
}
将其保存为 ArgIn.il。 要编译,只需在命令行中键入“ilasm ArgIn /dll
”。
该部分...
.assembly extern System.Windows.Forms
...值得额外说明。 这是我机器上的值,如果您的机器上不起作用,请将以下内容复制并粘贴到记事本中
using System;
using System.Windows.Forms;
class try1
{
public static void Main()
{
MessageBox.Show ("Test", "Test app");
}
}
将其保存为 test.cs,并从命令行键入“csc test.cs”进行编译。 将 test.exe 发送到 ildasm
并检查 MANIFEST
(双击它)中的内容。 如果需要,复制正确的值并将其应用于您的代码。
现在是时候编译客户端应用程序了。 ArgIn.dll 必须与 EXE 位于同一文件夹中。 从命令行执行“ilasm client.il
”,然后运行 client.exe。 您将看到带有消息“Hello from client
”和标题“From dll
”的消息框。
就是这么简单!
我希望您会发现 IL 汇编器非常友好,并编写一些您自己的代码。 最后,我要感谢 Microsoft 将 .NET 平台提供给公众,我的公司 Objectronics 为我提供 .NET Framework Beta 2 的副本,最后感谢我亲爱的朋友 Dmitri Vibornov,感谢他在编码和准备本文方面的想法和帮助。
如果您有任何问题或建议,请在下方留言。
许可证
本文没有明确的许可证附加到它,但可能包含文章文本或下载文件本身中的使用条款。 如有疑问,请通过下面的讨论区联系作者。 可以在 此处 找到作者可能使用的许可证列表。