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~1\microsoft.net\frameworksdk\bin;%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