CLR 是 .NET 平台的核心,没有之一。
组件对象模型(Component Object Mode, COM)是 CLR 的前身,它将 Windows 平台上运行的所有成员标准化,并定义了它们之间沟通的规范,使得不同编程语言的进程间通信和动态对象创建成为可能。
所有 COM 组件都实现了 IUnknown 接口,采用引用计数管理对象的生命周期。
当微软开始 .NET 框架的开发时,他们最终决定改进现有的 COM,并将它命名为公共语言运行时(Common Language Runtime, CLR)。
CLR 中组件间的沟通规范由元数据 (metadata)负责,因此,每个可迁移执行文件(即 .exe 文件)都包含了元数据,以便 CLR 知道文件内部的类型是什么。
所以,有人称“CLR 是一个更好的 COM”。
CLR 是让 .NET 程序执行所需的外部服务的集合,.NET 平台的核心和最重要的组件,类似于 Java 的 JVM。
它有如下的核心功能:
可以看到,绝大部分功能都是在程序运行时保证程序的顺利执行的。
因此,CLR 管理 .NET 程序集的执行,运行于操作系统之上。
CLR 的一些功能仅仅是操作系统的一个再包装,例如线程,内存管理等,这些实际上是进一步调用操作系统 API,访问内核对象。
但 JIT 则是它独有的,如果没有它,就不能把 IL 变成机器码,计算机也就不认识 C#,你也就不能运行 C# 程序。
对 CLR 了解越多,对整个 .NET 的把握就越好。
托管代码是必须在 CLR 下执行的代码,而非托管代码则不需要 CLR 的支持就可以运行。
CLR 本身用于管理托管代码,因此它是由非托管代码编写的,而并不是一个包含了托管代码的程序集,也不能使用基于 IL 的反编译工具进行查看。
CLR 位于 C:\%SystemRoot%\Microsoft.NET\Framework\[ 版本号 ]下,对应不同的机器有两个版本,一个是工作站版本的 mscorwks.dll,一个是服务器版本的 mscorsvr.dll。
wks 和 svr 分别代表 workstation(工作站) 和 server(服务器)。