Basics of the Common Language Runtime
.net 普通语言运行时(common lnguage runtime)是.net的一个概念,但却是核心的一个。普通语言运行时是.NET程序的运行环境,他提供了.NET程序和操作系统间的操作层,理论上,他与解释性语言的JAVA虚拟机一样,但也只是理论上,普通语言运行时不是解释性的。
由面向NET编译器产生的.NET程序被描述在一个虚拟的、中间形式,独立原来的编程语言,独立于目标机器和操作系统。也因为如此,由不同语言编写的.NET程序可以很方便的相互解释,不仅仅是调用函数方法上,而是可以直接使用类继承。
当然,给予不同的编程语言,必须建立一套策略来让程序遵循,以便更好的实现各个语言的友好相处。比如,你用C#写三个类,MYITEM,MyItem,myitem,Vb.net,就会无所适从。
保证.NET程序具有良好互操作性的这套规则,就是有名的CLS,他规定了 “命名规则”,数据类型,函数类型,以及其他元素,建立了一个不同语言标准。然而,他只是推荐,并非需要你完全遵守,比如你的程序没有遵循CLS,你的程序还是会通过CLR的,只不过在某些层面上,你的程序不能跟其他程序及你选哪个交互。
CLR环境,包含2个组件:元数据(metadata)和托管代码(managed code) .元数据是描述一个程序所有组成组成的系统--类,类成员、类方法、全局变量、他们的关系 等。托管代码描绘了一个程序的方法功能,被编码成为一个虚拟二进制形式,MSIL 或者CIL。
IL代码是被CLR托管的。CLR有3个(不仅)主要的功能,类型控制,结构异常处理和垃圾处理 。类型控制是在程序执行的时候,进行核算和转换数据的类型。结构异常处理,像非托管结构异常处理(C++),但是他是受CLR控制,而非操作系统。垃圾处理:动态的处理释放掉不用的资源,。
一个.net程序,包含了一个或者多个托管可执行文件,每个执行文件都包含元数据和(可选)托管代码。 托管代码是可选的(可有可无)的,是因为有些运行程序是没有方法的。托管的NET程序我们叫做程序集(assembly).托管可执行文件被成为modules .你的程序集可以有一个module也可以有多个。每一个程序集包含一个主要的(prime)module ,在元数据中包含了这个数据集的身份信息
在读取程序的时候,loader读取元数据并在内存中创建一个内部的表示层,来表征类和成员。这个事情当被需要的时候执行,也就是说,只有当类被引用的时候才被加载, 不被引用的将不加载,当加载一个类的时候,loader会运行一系列策略来检查相关元数据。