CIL
Common Intermediate Language 通用中间语言 ('CIL' ,以前被称为 MSIL) 是 .NET Framework 中使用的字节码中间语言。 编译为CLI字节码的代码被认为是 “托管代码”,可以由任何 CLI 兼容的编译器 (例如 C# 编译器) 创建,并由 Virtual Execution System (VES虚拟执行系统) 执行。 它是CPU和平台无关的。
大多数时候,开发人员不会直接在CIL中编程,而是使用更高级别的语言,例如 C#,C++/CLI,Visual Basic .NET 和 J#。 但是,CIL有自己的汇编语言,可以由ILAsm (ilasm.exe
) 汇编。 要以汇编语言显示字节代码,请使用CIL反汇编程序ILDAsm (ildasm.exe
)。 然而,一些专门的工具如.NET Reflector可以将字节码表示为任何支持的例如C#这样的高级语言,包括类,方法和其他元数据。
安全不安全的代码
CIL字节代码既可以被认为是安全的,也可以被认为是不安全的。 默认情况下,所有C# 都是安全的,这意味着执行系统始终知道所有数据在哪里。 因此,不可能在安全代码中使用指针。 得益于此属性,消除了最常见的安全性和稳定性问题,例如缓冲区溢出和悬空(dangling)指针。 使用 垃圾回收器 来尽可能高效地使用内存。
不安全的代码
尽管在安全代码中无法使用指针,但CIL支持不安全的代码,该代码确实支持指针。 不安全的代码包含在标记为 “不安全” 的代码块中,在C # 中,它使用与C和C相同的语法。 对象可以被 “pinned”,以便 垃圾收集器 不会移动数据,并且指针保持有效。 使用不安全的代码是完全合法的,尽管在正常的应用程序编程中不鼓励使用,并且可能用于编写内核级方法。
Executing CIL Code
CIL code is executed by a Virtual Execution System much like Java byte code. Usually this is in the form of a Just In Time compiler, which translates the byte code into a native machine code, usually utilizing optimizations specific to that processor (for example SSE if available). Mono is an open-source .NET project, which consists of an CIL JIT'er (and interpreter for unsupported architectures) as well as a C#->CLI compiler. The JIT'er and can be embedded in to any program or stand alone. The basic JIT'er and compiler is written in C and only requires the C Standard Library to run.
Metadata 元数据
CIL字节码只是.NET程序集的一半。 另一半是元数据,VES使用它来查找需要调用的方法。 这使得继承或扩展类和覆盖方法成为可能,这样正确的覆盖方法将在运行时调用,而无需重新编译调用程序集。