首页 / 软件开发 / .NET编程技术 / .NET CIL系列第一篇:CIL介绍和入门
.NET CIL系列第一篇:CIL介绍和入门2010-11-14 博客园 xueflyCIL编程的本质CIL是英文Common Intermediate Language的简写。CIL本质上其实就是.NET平台的母语。当开发人员选择一种托管的(C#、VB、COBOL.NET等)构建.NET程序集时,同这个语言相关的编译器就会把源代码编译成CIL。正如其他任何一种编程语言一样,CIL提供了非常多的结构和实现标记。如果考虑到CIL其实也是一种.NET的编程语言,那么通过直接使用.NET Framework 3.5 SDK提供的CIL和CIL编译器(ilasm.exe)来开发和构建.NET程序集也就不会让人吃惊了。事实上很少有人会选择完全使用CIL来构建一个.NET应用程序,不过CIL本身还是非常有趣的。简单的说,对CIL语法理解的越多,那么就越有可能进入.NET的高级领域。具体一点儿说,理解并掌握CIL的人应该能达到以下几点。n 清楚地理解不同的.NET编程语言是如何映射他们各自的关键字到CIL标记的。n 反汇编一个已经存在的.NET程序集,直接编辑CIL代码,最后重新编译更改后的代码到.NET二进制文件。n 使用System.Reflection.Emit命名空间构建动态程序集。n 理解那些存在于CIL层中,但是不被高级托管语言所支持的CTS的特性。要知道,CIL是唯一一种允许你访问和使用所有CTS特性的.NET语言。例如,使用纯粹的CIL,就可以定义全局的成员和字段,而这在C#中是不允许的。最后,再次强调一下,即使你不想在CIL细节上纠缠,也完全有能力掌握.NET的基类库。从很多方面来看,CIL对于.NET开发人员就好像汇编语言对于一个C++程序员一样。那些精通底层细节的开发人员可以具备应用高级技术手段来解决手上问题的能力,同时对于编程(运行)环境底层也会有一个深入的理解。如果你愿意接受挑战,那么就让我们一同来揭开CIL的神秘面纱吧。作为这个系列的开篇我们简要介绍了一下CIL的本质,和学习CIL的价值所在。既然有必要学习CIL,下面就让我们正式进入CIL的世界吧。CIL指令、特性和操作码当研究CIL这样的底层开发语言时,一定会发现一些非常熟悉的概念被套用上了新的名字。例如,如果这里列出如下这些关键字:{new, public, this, base, get, set, explicit, unsafe, enum, operator, partial}你肯定知道它们是C#的关键字。然而,如果再仔细看看这些集合中的成员,也许会发现尽管它们是C#中的关键字,但是他们有着本质上的语义区别。比如,enum这个关键字定义了一个从System.Enum派生的类型,this 和base关键字允许分别引用当前的对象或者当前对象的父类。unsafe关键字被用来确认一个不可以直接被CLR监控的代码段,operator则允许构建一个可以通过特定的C#运算符(例如加号)来访问的隐藏的方法。同C#这样的高级语言完全不同的是,CIL不仅仅定义了一组通用的关键字,而且根据语义上的内涵不同,这些被CIL编译器识别的标记进一步被划分到3个类别中。n CIL指令(directive)。n CIL特性(attribute)。n CIL操作码(opcode)。每一个类别的CIL标记都通过一个特别的语法来表示,这些标记组织到一起来就可以构建出一个有效的.NET程序集。1.CIL指令的作用在CIL的标记集中有这样一组用于描述.NET程序集总体结构的标记,它们被称作CIL指令。CIL指令用于通知CIL编译器如何定义在程序集中用到的命名空间、类型和成员。CIL指令语法上使用一个(.)的前缀来表示,例如.namespace、.class、.publickeytoken、.method、.assembly等。因此,如果你的*.il文件*(CIL代码文件的拓展名)有1个.namespace指令和3个.class指令,那么CIL编译器将在生成的程序集里产生一个包含有3个.NET类类型的命名空间。