CLR 是 Common Language Runtime 的缩写,翻译为 公共语言运行时。它是 .NET 框架的核心组件,负责执行由 .NET 编程语言(如 C#、VB.NET、F# 等)编写的程序。

CLR 的主要功能:

  1. 代码执行:CLR 是 .NET 程序的执行环境,它将中间语言(IL)代码转换为机器代码,使程序能够在不同的操作系统和硬件平台上运行。

  2. 内存管理:CLR 提供了自动垃圾回收功能(GC,Garbage Collection),自动回收不再使用的对象所占用的内存,减少内存泄漏问题。

  3. 类型安全:CLR 确保程序的类型安全,防止程序访问未授权的内存或类型错误。

  4. 异常处理:CLR 提供了统一的异常处理机制,确保不同语言的程序能够一致地处理错误。

  5. 跨语言互操作性:CLR 使得不同编程语言编写的代码能够互操作。例如,C# 编写的代码可以调用 VB.NET 编写的类和方法。

  6. 安全性:CLR 提供了多层次的安全性检查(例如代码访问安全性,CAS)来防止恶意代码的执行。

CLR 主要包含的部分:

  • JIT 编译器(Just-in-Time Compiler):CLR 中的 JIT 编译器负责将中间语言(IL)编译成特定平台上的机器代码。

  • 垃圾回收器(GC):CLR 包含一个自动垃圾回收机制,它监控程序的内存使用,自动清理不再使用的对象。

  • 类型系统:CLR 定义了 .NET 类型系统(包括值类型、引用类型、数组等),并且管理类型的加载和执行。

  • 程序集(Assembly):CLR 使用程序集(通常是 .dll 或 .exe 文件)来组织代码,程序集包含了元数据和 IL 代码,供 CLR 运行时执行。

CLR 与其他技术的关系:

  • .NET Framework:CLR 是 .NET Framework 的一部分,提供了核心的运行时支持。其他 .NET 组件(如 BCL,Base Class Library)则提供了编程所需的基础类库。

  • **.NET Core 和 .NET 5/6+**:随着 .NET Core 和后来的统一平台 .NET 5/6+ 的发展,CLR 在这些新版本中仍然存在,但它在不同平台上的实现进行了优化和统一。

CLR 的作用:

  • 平台独立性:CLR 使得开发者能够编写跨平台的代码。在不同的操作系统上运行时,CLR 会将中间语言(IL)代码转换为本地机器代码,保证代码可以在各种平台上执行。

  • 语言无关性:CLR 提供了语言之间的互操作性,不同语言的程序可以在相同的运行时环境下执行,方便跨语言开发。

小结:

CLR 是 .NET 平台的核心,它为程序提供了代码执行、内存管理、类型安全、垃圾回收等功能。通过 CLR,开发者可以编写语言无关、平台无关的代码,在多种平台上运行,并享受 .NET 提供的各种功能支持。

跨平台

CLRCommon Language Runtime)与跨平台的关系体现在它作为 .NET 平台的核心组件,为不同平台上的应用程序提供了运行时支持,使得使用 .NET 编写的应用可以在多种平台上运行。这一跨平台能力得到了特别的关注和增强,尤其是随着 .NET Core 的发展以及后来的 .NET 5/6+ 的发布,使得 .NET 不再局限于 Windows 平台,而是支持包括 Linux、macOS、iOS、Android、Web 等多种操作系统和设备。

CLR 如何实现跨平台支持:

  1. 平台无关性

    • 中间语言(IL):CLR 允许将源代码编译为平台无关的 中间语言(IL),这意味着开发者编写的代码不依赖于特定的硬件或操作系统,而是被编译成中间语言后可以在任何支持 CLR 的平台上运行。
    • 这些中间语言的代码在运行时通过 CLR 进行转换,CLR 将中间语言转换为适合当前操作系统和硬件平台的机器代码。
  2. 跨语言互操作性

    • CLR 支持多种编程语言(例如 C#、F#、VB.NET 等),这些语言都可以编译成相同的中间语言,并运行在 CLR 上。因此,无论在何种平台上,CLR 可以确保不同语言的代码能够互相调用和协作运行。这种语言间的互操作性,进一步增强了跨平台开发的灵活性。
  3. 运行时环境的适配

    • CLR 并不是固定于某一平台的,它的具体实现会根据不同的操作系统和硬件平台进行适配。例如:
      • Mono:这是一个开源的 CLR 实现,最初是为 Linux 和 macOS 提供对 .NET 的支持,后来发展成一个跨平台的框架,支持 iOS、Android 等移动平台。
      • **.NET Core / .NET 5+**:随着 .NET Core 的推出,微软将 CLR 引入了跨平台支持的主流框架中,尤其是在 Linux 和 macOS 上提供了官方支持。dotnet 命令行工具以及 .NET Core runtime 可以在多个平台(如 Linux、macOS、Windows)上运行和部署。
  4. 垃圾回收与内存管理

    • CLR 的垃圾回收(GC)机制能够在不同平台上高效地管理内存。无论是 Windows 还是 Linux,CLR 都会根据平台的内存管理特性,优化垃圾回收的执行。
  5. 平台特定实现

    • 在跨平台执行时,CLR 通过抽象化平台特定的实现细节,使得相同的 .NET 应用可以在不同平台之间无缝迁移。例如,在 iOS 上运行的 .NET 应用会使用 Mono 或 .NET MAUI(跨平台 UI 框架)来实现特定于 iOS 的功能,而在 Windows 上则使用 Windows 特有的 API。
  6. 移植和兼容性

    • CLR 的设计考虑了不同平台的硬件架构、操作系统特性等差异,因此它能够通过特定的运行时实现(如 Mono 或 .NET Core)来处理各平台上的差异,确保相同的代码可以在多个平台上运行。

CLR 与 Unity 的跨平台能力:

在 Unity 中,Unity 引擎本身使用的是 Mono(早期)或 IL2CPP(后期)来支持跨平台开发:

  • Mono 是 Unity 早期支持的 .NET 实现,它是 CLR 的一个跨平台版本,提供了 C# 脚本的执行和管理功能,支持 Windows、macOS、Linux、iOS、Android 等多种平台。
  • IL2CPP(Intermediate Language To C++)是 Unity 的另一种技术,它通过将 C# 代码转换为 C++ 代码,然后使用本地编译器生成目标平台的二进制代码,从而绕过 CLR 的运行时并提高性能。IL2CPP 支持更广泛的平台,包括移动设备、控制台和 WebGL 等。

通过这些技术,Unity 实现了广泛的跨平台支持,允许同一份 C# 代码在多种平台上运行。

总结

  • CLR 是 .NET 框架的运行时环境,它通过将代码编译成中间语言(IL)并在运行时将其转换为目标平台的机器代码,提供了强大的 跨平台能力
  • 跨平台支持 体现在 CLR 适配了不同平台(如 Windows、Linux、macOS、移动平台等),并提供了通用的执行环境,这使得 .NET 应用可以在多种操作系统和硬件平台上运行。
  • 在 Unity 中,CLR 的跨平台支持通过 MonoIL2CPP 实现,确保 Unity 的 C# 脚本可以在多个平台上运行。

通过 CLR 和其跨平台机制,开发者可以编写一次代码,在多个平台上运行和部署,极大提高了开发效率。