Welcome

首页 / 软件开发 / C# / 《C# to IL》第一章 IL入门

《C# to IL》第一章 IL入门2011-09-22 博客园 包建强1-

我们用C#、VB.NET语言编写的代码最终都会被编译成程序集或IL。因此用VB.NET编写的代码 可以在C#中修改,随后在COBOL中使用。因此,理解IL是非常有必要的。

一旦熟悉了IL,理解.NET 技术就不会有障碍了,因为所有的.NET语言都会编译为IL。IL是一门中性语言。IL是先发明的,随后才有 了C#、VB.NET等语言。

我们将在一个短而精辟的程序中展示IL。我们还假设读者至少熟悉一 门.NET语言。

a.il

.method void vijay()
{

}

随后,我们用IL编写了一个非常短小的IL程序——它显然是不能工作的,并 将它命名为a.il。那么我们怎么才能把它编译为一个可执行程序呢?不需要为此而焦急,Microsoft提供 了一个ilasm程序,它的唯一任务就是从IL文件中创建可执行文件。

在允许这个命令之前,要确保 你的变量路径被设置为framework中的bin子目录。如果不是,请输入命令如下:

set path=c:progra~1microsoft.netframeworksdkin;%PATH%

现在,我们使用如下命令:

c:il>ilasm /nologo /quiet a.il

这样做会生成下面的错误:

Source file is ANSI

Error: No entry point declared for executable

***** FAILURE *****

将来,我们将不会显示由ilasm生成的输出的第一行 和最后一行。我们还将移除非空白行之间的空白行。

在IL中,允许我们使用句点.作为一行的开始 ,这是一条指令,要求编译器执行某个功能,如创建一个函数或类,等等。任何开始于句点的语句都是一 条实际俄编译器指令。

.method表示创建一个名为vijay的函数(或方法),并且这个函数返回 void,即它不返回任何值。因为缺少较好的命名法则,函数名称vijay显得很随意。

汇编器显然理 解不了这个程序,从而会显示“no entry point”的消息。这个错误信息的生成是因为IL文件 能够包括无数的函数,而汇编器无法区分哪个会被首先被执行。

在IL中,首先被执行的函数被称 为进入点(entrypoint)函数。在C#中,这个函数是Main。函数的语法是,名称之后是一对圆括号()。 函数代码的开始和结束用花括号{}来表示。

a.il

.method void vijay()
{
.entrypoint
}

c:il>ilasm /nologo /quiet a.il

Source file is ANSI

Creating PE file

Emitting members:

Global Methods: 1;

Writing PE file

Operation completed successfully