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
作者:mFrog(mFrog的技术博客)
出处:http://mFrog.cnblogs.com/
本文版权由作者全部保留,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。