CIL的作用简介

CIL是一种和平台无关的语言。不管使用任何支持.NET的语言,相关编译器都生成CIL指令。例如下面的C#代码构成一个简单的计算器


//*.cs

using System;
namespace CilExample
{
    //应用程序入口
    public class CilApp
    {
        static void Main()
        {
            Calc calc = new Calc();
            int result = calc.Add(10,84);
            Console.WriteLine("10+84={0}",result);

            //按回车结束程序
            Console.ReadLine();
        }
    }

    //C#计算器
    public class Calc
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}
一旦编译器(csc.exe)编译这段代码,就会得到一个单文件*.exe程序集。这个程序集中包含一个程序集清单、CIL指令和描述Calc
与CilApp类的各方面数据。例如如果用ildasm.exe打开该程序集,会发现Add()方法被CIL表示为:

.method public hidebysig instance int32 Add(int32 x,int32 y) cil managed
{
   
.maxstack 2
.locals int ([0] int32 cs$1$0000)
IL_0000:ldarg.1
IL_0001:ldarg.2
IL_0002:add
IL_0003:stloc:0
IL_0004:br.s   IL_0006
IL_0006:ldarg.0
IL_0007:ret
}

现在用VB.NET创建和上面一样的程序
//*.vb
Imports System

Namespace CilExample
    Module CilApp
        Sub Main()
            Dim c As New Calc
            result = c.Add(10, 84)
            Console.WriteLine("10+84={0}", result)
            Console.ReadLine()
        End Sub
    End Module

    Class Calc
        Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
            Return x + y
        End Function
    End Class


End Namespace

 

如果查看他的CIL代码你会发现非常相似,只有很少的差别


.method public hidebysig instance int32 Add(int32 x,int32 y) cil managed
{
   
.maxstack 2
.locals int ([0] int32 Add)
IL_0000:nop
IL_0001:ldarg.1
IL_0002:ldarg.2
IL_0003:add.ovf
IL_0004:stloc.0  
IL_0005:br.s     IL_0007
IL_0007:ldarg.0
IL_0008:ret
}

从这就可以看出CIL很明显的好处:语言的集成性
每种支持.NET的编译器生成的是几乎完全相同的CIL指令,因此,所有语言都能很好的定义明确的二进制文件相互交互
此外CIL是平台无关的。
暂时到这,后面会更加详细的介绍CIL


 

posted @ 2008-10-10 08:47  mFrog  阅读(1294)  评论(1编辑  收藏  举报