我想知道 CLR 和 CLI 之间到底有什么区别?从我目前所读的任何内容来看,这似乎表明 CLI 是 CLR 的一个子集。但是 CLR 中的所有内容都不是强制性的吗?在 CLR 中创建 CLI 时可能会遗漏什么?
7 回答
CLR 是安全托管/运行 .NET 应用程序的执行环境。
您可以将其视为 .NET 的私有操作系统,它在 .NET 应用程序启动之前启动和加载。
CLR 负责处理任何 .NET 应用程序的某些基本要求,否则这些应用程序需要编写大量经过深思熟虑的代码才能实现;要求本质上是整体的,对于任何类型的应用程序以良好、高效和安全的方式运行都是必不可少的[例如,处理内存分配并在不需要时释放它,避免悬空指针,避免类型转换错误等]
另一方面,CLI 是一个规范/指南集,它解释了如何实现应用程序执行环境以及生成的应用程序代码的性质,允许在不同的计算机平台上使用多种高级语言,而无需针对特定架构进行重写。
CLI 由 Microsoft 开发并由 ISO 和 ECMA 标准化。
CLR 是 CLI 的 VES [虚拟执行系统] 部分的实际实现,是 MS.NET 平台的核心组件之一
用外行的话来说,CLI 是菜谱,而 CLR 是美食 :-)
CLR(公共语言运行时)是微软对 VES(虚拟执行系统)的实现。VES 连同 CTS(通用类型系统)、CLS(通用语言规范)和元数据规范都是 CLI(通用语言基础设施)规范的一部分。
VES 是一种标准化的虚拟机规范,必须实施它才能加载和执行 CIL(通用中间语言)模块(dll 和 exe)。VES 实现还提供运行时服务,例如垃圾收集和安全性。
CLR 是运行各种 .net 应用程序的 .net 执行环境。例如,当您使用 C# 或 dot NET 堆栈中的其他语言编写代码时,编译器会编译并将其转换为托管模块。托管模块是 IL(中间语言)和元数据。最重要的是,要记住的重要一点是,无论何时编译源代码,编译器都会将其转换为托管模块。需要澄清的是,这不是您的处理器将执行的机器代码。事实上,IL 是一种接近汇编语言的中间语言。同样,它也以面向对象的机器语言而闻名。
查看这篇文章以获得更详细的解释:
http://alevryustemov.com/programming/common-language-runtime/
公共语言运行时 (CLR) 是一种编程,它管理以多种受支持语言中的任何一种编写的程序的执行,允许它们共享以任何语言编写的通用面向对象类。它是 Microsoft .NET Framework 的一部分。CLR 在某种程度上类似于 Sun Microsystems 提供的用于运行从 Java 语言编译的程序的 Java 虚拟机。Microsoft 将其 CLR 称为“托管执行环境”。为 CLR 编译的程序不需要特定于语言的执行环境,并且可以轻松移动到任何装有 Windows 2000 或 Windows XP 的系统上并在其上运行。
尽管
公共语言基础结构是微软开发的一个标准,它允许在不同的计算机平台上使用多种不同的高级语言,而无需为任何特定的架构重写代码。简而言之,公共语言基础设施 (CLI) 使以任何常用编程语言编写的应用程序能够在使用通用运行时程序而不是特定于每种语言的任何操作系统上运行。.NET Framework、.NET Core 和 Mono 是 CLI 的一些实现。
CLR 是 CLI、CTS、CLS 集成工作的完整环境,它还包括垃圾收集、内存管理、安全性、本机代码的中间语言...... CLI是可执行代码格式的规范,以及运行时环境可以执行该代码。