一、CLR、CLI、CTS、CLS、BCL、FCL简介
- CLI(公共语言基础)
CLI是微软公司向ECMA提交的一份语言和数据格式规范,CLR是目前为止唯一一个公共语言基础的实现版本。CLI包括了公共类型系统(CTS)、公共中间语言(CIL)、底部文件格式以及元数据格式等。
- CLR(公共语言运行库)
CLR是一个CLI的实现,包含了.NET运行引擎和符合CLI的类库。我们开发的几乎所有的.NET程序都基于CLR的类库来实现,并且运行在CLR提供的运行引擎之上。
- CTS(公共类型系统)
CTS定义了一个能够在CLR上运行的语言规范。尽管有很多语言本身不符合CTS规范,但是通过加强编译器,改变语言附加规范等手段,使得许多语言能够编写出能在CLR上运行的程序。一种语言编写的程序编译能够在CLR上运行,并不代表这种语言本身完全符合CTS的规范。例如C 语言,仍然保持了其不符合CTS规范的部分,并且在编译时把这部分不符合CTS的代码编译成原始代码而非中间代码。
- CLS(公共语言规范)
CLS是CTS的一个子集,它定义了希望编写在.NET平台上运行的程序的语言所需符合的最小规范。正因为.NET允许由不同语言编写的程序一起执行,所以才制定出CLS规范,用以避免不同语言特性产生的错误。在.NET Framework中,几乎所有(但不是所有)的类都是与CLS兼容的。在MSDN文档说明中,不兼容的类和方法都被特别标记为不兼容,例如System命名空间中的UInt32结构。UInt32表示32位无符号整数。并不是所有的语言(例如Visual Basic.NET或J#)都支持无符号的数据类型,这种数据类型是与CLS不兼容的。
- BCL,基础类库(Base Class Library)
BCL是一个公共编程框架,称为基类库,所有语言的开发者都能利用它。是CLI(Common Language Infrastructure,公共语言基础结构)的规范之一,主要包括:执行网络操作,执行I/O操作,安全管理,文本操作,数据库操作,XML操作,与事件日志交互,跟踪和一些诊断操作,使用非托管代码,创建与调用动态代码等,粒度相对较小,为所有框架提供基础支持。
- FCL,框架类库(Framework Class Library)
FCL提供了大粒度的编程框架,它是针对不同应用设计的框架 ,FCL大部分实现都引用了BCL,例如我们常说的开发框架:ASP.NET(Core)、Windows Forms、WPF等等,提供了针对不同层面的编程框架 。
二、CLR
通用语言执行平台(Common Language Runtime,简称CLR)是微软为他们的.NET的虚拟机所选用的名称。它是微软对通用语言架构(CLI)的实现版本,它定义了一个代码执行的环境。CLR执行一种称为通用中间语言的字节码,这个是微软的通用中间语言实现版本。 CLR目前已稳定运行于各个平台之中。
CLR 和类库与应用和整个系统的关系
来源 : https://docs.microsoft.com/tr-tr/dotnet/framework/get-started/overview CLR 组件
来源 : https://www.slideshare.net/Thenmurugeshwari/architecture-of-net-framework
在 CLR 中,垃圾回收器充当自动内存管理器。C# 以及 CLR 之上的其他语言的内存都是通过垃圾回收器回收的。
CLR 主要功能
- 基类库支持 Base Class Library Support
- 内存管理 Memory Management
- 线程管理 Thread Management
- 垃圾回收 Garbage Collection
- 安全性 Security
- 类型检查 Type Checker
- 异常管理 Exception Manager
- 调试管理 Debug Engine
- 中间码(MSIL)到机器代码(Native)编译
- 类别装载 Class Loader
开发人员使用高级编程语言编写程序。接下来编译器将代码编译成微软的中继语言(MSIL)。执行的时候CLR会将MSIL码转换为操作系统的原生码(Native code)。CLR内置有即时编译器。 实际上,CLR代理了一部分传统操作系统的管理功能,通常将在CLR的控制下运行的代码称为托管代码,否则称为非托管代码。
执行流程
将源代码(vb、cs)编译成托管代模块。托管代码块由中间语言和元数据组成。 将托管代码合并成程序集。 加载公共语言运行库。 执行程序集的代码。 生成本地代码。
优点
它通过在运行时提供程序之间提供丰富的交互来提高性能。 通过消除在支持程序的任何操作系统上重新编译程序的需要来增强可移植性。 安全性也会提高,因为它会分析MSIL指令是安全的还是不安全的。此外,使用委托代替函数指针增强了类型的安全性。 在垃圾回收器的帮助下支持自动内存管理。 提供跨语言集成,因为 CLR 中的 CTS 提供了一个通用标准,该标准激活了不同的语言以扩展和共享彼此的库。 支持使用在其他 .NET 编程语言中开发的组件。 提供语言、平台和体系结构独立性。 它允许轻松创建可扩展的多线程应用程序,因为开发人员无需考虑内存管理和安全问题。