ET提供了一个运行环境,叫做公共语言运行时(CLR)。CLR管理代码的执行并使开发过程变得更加简单。CLR是一种受控的执行环境,其功能通过编译器与其他工具共同展现。以“运行时”为目标的代码称为受控代码(Managed Code)。受控代码指向的对象在执行过程中完全被CLR所控制。在执行过程中,CLR提供自动内存管理、调试支持、增强的安全性及与受控代码(如COM组件)的互操作性。凡是符合CLS(公共语言规范)的程序语言(如C#和Visual Basic.NET等)所开发的程序都可以在任何有CLR的操作系统上执行。在某种程度上,CLR和Java的虚拟机有异曲同工之妙。
运行语言特点是交叉语言集成、自描述组件、简单配制和版本化及集成安全服务。
运行语言使用一种新的能表达大部分现代编程语言语义的通用类型系统,通用类型系统定义了一套标准类型及生成新标准的规则。运行语言知道怎样生成、执行这些类型。编译器和解释器使用运行语言服务定义类型、管理对象、进行方法调用,而不是使用工具或特定于语言的方法。
类型系统的主要设计目的是使多种语言能深度集成。用一种语言所写的代码能继承用另一种语言所写的类的实现,用一种语言所写的代码抛出的异常能被用另一种语言写的代码捕获,像调试和剖析之类的操作会在完全封闭下工作,而不用考虑代码所用的语言。这就意味着编写可重用类库的开发者,不再需要为每一种编程语言或编译器生成一个版本,并且类库的开发者不再受到为他们使用的编程语言开发的库的限制。
自描述组件――现在Microsoft .NET框架上已成为可能,简化了开发和配制,并提高了系统的可靠性。许多由运行语言提供的服务是由元数据及用于补充可执行代码的信息所驱动。因为所有的信息都储存在一起,只有可执行的(代码)才被称为自描述组件。
自描述组件的一个主要优点是,使用它们并不需要其它文件。类的定义不需要单独的头文件;通过检查原数据对类的定义可以从组件自身获得。跨语言或过程边界访问组件并不需要各自的IDL文件、类型文件或proxy/stubs;所必需的信息已存在于元数据之中。为识别开发者请示的服务属性,并不需要展开各自的配制信息。 最主要的是,由于元数据是在编译过程中由源代码生成,并与可执行代码储存在一起,它将永远和可执行部分同步。
除了改善对单个组件的配制,Microsoft .NET框架定义了一个应用程序配制模板,以解决定置应用程序安装和DLL版本化(通常被称为“DLL Hell”)这一复杂过程的问题,运行语言提供了支持这个模板的服务。
Microsoft .NET框架 引入了组合体的概念。一个组合体是一组资源和类型,并包括有关这些资源和类型的元数据,也就是被作为一个单元配制的。元数据被称为组合体的名单,它包含象类型和资源表之类能被组合体外看得见的信息,这个名单也包括有关从属关系之类的信息,例如组合体建立时的版本号。开发人员可以指定版本策略,以指示运行语言是否装入系统上已安装的依赖于组合体的最新版本,装入一个指定版本,或在编译时使用的版本。
某软件组件的多个拷贝总可以存在于同样的操作系统上,然而,通常说来,只有其中的一个拷贝能被操作系统注册、调入内存、执行。对系统来说,定位和调入内存的策略是全局性。。NET Framework Common Language Runtime 增加了所必须的体系架构以支持管理组件定位和调入的每个应用程序策略,这通常被称为并行配制。
组合体可以被一个应用程序私有,或被多个应用程序共享。一个组合体的多个版本可以同时配制在同一台机器上。应用程序配制信息定义了到何处去查找组合体,这样runtime就能为同时运行的两个不同的应用程序装入同一组合体的不同版本。这就消除了由组件版本的不兼容性引起的问题,提高了系统整体的稳定性。如果必要,管理员可以为配制时刻的组合体增加配制信息,例如一个不同的版本策略,但是编译时提供的原始信息永远不会丢失。
因为组合体是自描述的,所以并不需要在系统上进行显式注册。应用程序的配制简单到只需将文件拷贝到目录中既可(如果为了使应用程序能够运行,必须安装未经组织过的组件的话,情况会稍微复杂一点)。配制信息保存在可被任何文本编辑器编辑的XML文件中。
最后,运行语言也提供完整的、普遍深入的安全服务,以确保未经授权的用户不能访问机器上的资源,并且代码不会执行未经允许的动作。这就提高了系统整体的安全性可靠性。 由于运行语言用于装入代码、生成对象、执行方法调用,所以当受控代码装入内存执行时,运行语言能进行安全检查,强化安全策略。
Microsoft .NET框架不仅规定代码访问安全,还规定基于角色的安全。通过代码访问安全机制,开发人员能为应用程序指定完成工作所必需的权限。例如,代码或许需要写文件或访问环境变量的权力。这类信息和有关代码标志的信息一起存储在配制级上的。当代码装入内存及执行方法调用时,运行语言验证是否能给予代码所要求的权限。如果不能,将记录一条安全冲突信息。给予权限的策略,这被称为信任策略,是由系统管理员建立的,并且是建立在关于代码的证据基础之上,比如:代码是谁发布的,是从什么地方获得的,以及在组合体中找到的代码标志和它要求的权限。开发人员可以指定他们显然不需要的权限,以防止其它人恶意使用他们的代码。如果所需要的权限依赖直到运行时刻才会知道的信息,那么就可写入纲邻性的安全检查。
除了代码访问安全,运行语言还支持基于角色的安全。基于角色的安全建立同代码访问安全一样的权限模板,只是这些权限是建立在用户的身份之上,而不是建立在代码的标志之上。角色表明了用户所属的类,并且可以在开发和配制阶段定义。给予权限的策略被分配到每个预定义的角色。在运行时刻,用户的身份被确定,代码将代表这个身份运行。运行语言决定用户是哪个角色的成员,然后给予基于这个角色的权限。