65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (4投票s)

2001年9月3日

3分钟阅读

viewsIcon

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) 更改为 stringREG_SZ,设置为“cmd.exe %1”。 这允许您使用上下文菜单(右键单击文件夹图标并选择 CmdLine)打开命令行。 此外,在“C:\Documents and Settings\whatever your name is\SendTo”中为 Notepad.exeildasm.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,感谢他在编码和准备本文方面的想法和帮助。

如果您有任何问题或建议,请在下方留言。

许可证

本文没有明确的许可证附加到它,但可能包含文章文本或下载文件本身中的使用条款。 如有疑问,请通过下面的讨论区联系作者。 可以在 此处 找到作者可能使用的许可证列表。

© . All rights reserved.