公共语言运行时 (CLR) 概述

.NET 提供一个名为公共语言运行时的运行时环境,该运行时运行代码并提供使开发过程更轻松的服务。

编译器和工具公开公共语言运行时的功能,使你能够编写受益于托管执行环境的代码。 使用面向运行时的语言编译器开发的代码称为托管代码。 托管代码受益于跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、组件交互简化模型以及调试和分析服务等功能。

注释

编译器和工具可以生成公共语言运行时可以使用的输出,因为类型系统、元数据的格式和运行时环境(虚拟执行系统)都由公共标准(ECMA 公共语言基础结构规范)定义。 有关详细信息,请参阅 ECMA C# 和公共语言基础结构规范

若要使运行时能够向托管代码提供服务,语言编译器必须发出元数据来描述代码中的类型、成员和引用。 元数据随代码一起存储;每个可加载的公共语言运行时可移植可执行文件 (PE) 文件都包含元数据。 运行时使用元数据来查找和加载类、在内存中布局实例、解析方法调用、生成本机代码、强制实施安全性和设置运行时上下文边界。

运行时会自动处理对象布局并管理对对象的引用,并在不再使用对象时释放它们。 以这种方式管理其生存期的对象称为托管数据。 垃圾回收可消除内存泄漏和其他一些常见的编程错误。 如果代码是托管的,则可以在 .NET 应用程序中使用托管数据、非托管数据,或者同时使用托管数据和非托管数据。 由于语言编译器提供自己的类型(如基元类型),你可能并不总是了解或需要了解你的数据是否被管理。

借助公共语言运行时,可以轻松设计其对象跨语言交互的组件和应用程序。 以不同语言编写的对象可以相互通信,其行为可以紧密集成。 例如,可以定义类,然后使用其他语言从原始类派生类或对原始类调用方法。 还可以将类的实例传递给用其他语言编写的类的方法。 这种跨语言集成是可能的,因为面向运行时的语言编译器和工具使用运行时定义的通用类型系统。 它们遵循运行时的规则来定义新类型以及创建、使用、持久化和绑定到类型。

作为元数据的一部分,所有托管组件都包含信息,说明它们是与哪些组件和资源一起构建的。 运行时使用此信息来确保组件或应用程序具有所需的一切的指定版本,这使得你的代码由于某些未满足的依赖项而不太可能中断。 注册信息和状态数据不再存储在注册表中,在注册表中很难建立和维护它们。 而是使用代码作为元数据存储有关定义的类型及其依赖项的信息。 这样,组件复制和删除的任务就不那么复杂了。

语言编译器和工具以对开发人员有用和直观的方式公开运行时的功能。 运行时的某些功能在一个环境中可能比另一个环境中更明显。 运行时体验方式取决于所使用的语言编译器或工具。 例如,如果你是 Visual Basic 开发人员,你可能会注意到,使用公共语言运行时,Visual Basic 语言具有比以往更多的面向对象的功能。 运行时提供如下优点:

  • 性能得到了改进。

  • 能够轻松使用其他语言开发的组件。

  • 类库提供的可扩展类型。

  • 面向对象的编程的继承、接口和重载等语言功能。

  • 支持显式自由线程处理,允许创建多线程和可缩放的应用程序。

  • 支持结构化异常处理。

  • 支持自定义属性。

  • 垃圾回收。

  • 使用委托取代函数指针,从而增强了类型安全和安全性。 有关委托的详细信息,请参阅 通用类型系统

CLR 版本

.NET Core 和 .NET 5+ 版本具有单个产品版本,即没有单独的 CLR 版本。 有关 .NET Core 版本的列表,请参阅 下载 .NET Core

但是,.NET Framework 版本号不一定与它包括的 CLR 的版本号相对应。 有关 .NET Framework 版本及其相应的 CLR 版本的列表,请参阅 .NET Framework 版本和依赖项

标题 DESCRIPTION
托管执行过程 介绍利用公共语言运行时所需的步骤。
自动内存管理 描述垃圾回收器如何分配和释放内存。
.NET Framework 概述 介绍关键 .NET Framework 概念,例如通用类型系统、跨语言互作性、托管执行、应用程序域和程序集。
通用类型系统 介绍如何在运行时中声明、使用和管理类型,以支持跨语言集成。