.NET Core 是如何实现跨平台或平台无关的?

How Cross-Platform or Platform-independent is achieved in .NET Core?

我们都知道 .NET Core 是独立于平台的,并且可以 运行 在任何 OS 上,例如 Windows、Linux 或 Mac。

我只是有点想知道,在 .NET Core 的情况下,跨平台是如何实现的,而在 .NET Framework 的情况下,跨平台是如何实现的。

如果有人解释的话会很有帮助。

提前致谢

造成这种情况的因素有多种。重要的包括:

  • 与特定于操作系统的 API 集成

操作系统提供了许多低级功能,从通过网络访问文件到调度。正如在 C/C++ 中一样,您可能需要针对 Windows 和 Linux 或 macOS.

实施不同的事情

.NET Framework 是 windows 特定的,因此必须为 Linux / macOS 抽象和实现许多不同的东西以实现兼容性。例如。使用 unix 套接字 API 代替 Winsock 进行联网。

另请注意,垃圾收集利用了更高级的内存和调度 API,这些在所有平台上也不存在 1:1,因此存在实施差异。

  • 重新实现一些 Windows 为 .NET 封装的功能

图形 (System.Drawing) 或 WCF 托管等某些功能实际上更像是 Windows 的功能,而不是 .NET Framework 的功能。其中一些必须在纯 .NET 中重新实现,或者分离成可以在 .NET Core / .NET 5+ 上使用的支持包,但仅在 运行 on windows 时才有效。其他(WCF 托管)已完全删除。

另一个很好的例子是全球化支持,因此在 .NET 中处理特定于语言的细节。这用于许多字符串操作、字符串格式化(例如,以各种语言格式化月份名称)等。在 Windows 这曾经使用 National Language Support APIs but for Linux and macOS this was implemented for .NET Core using the International Components for Unicode (ICU) 库。这会导致这些版本之间存在一些行为差异。在 .NET 5+ 中,即使是 Windows 版本的 .NET 也会在可用时尝试使用 ICU,因为它已包含在 2019 年的 Windows 10 中。

  • 为不同的架构生成本机代码

.NET 使用用户代码编译成的中间语言 (IL),它不是机器可执行格式,但可以翻译成针对代码所在系统的本机机器代码优化的 运行 .这种即时编译器 (JIT) 需要支持所有机器架构(Intel 架构、ARM 架构、32/64 位,现在 WebAssembly 也即将推出,...)。 .NET Framework 中的 JIT 编译器仅支持 Intel 指令集。

有些架构/操作系统甚至对此有具体规定。例如。 macOS 64 位 ARM(例如 M1 芯片)与 Linux 在调用约定(需要与 OS 和库集成)方面略有不同。此外,围绕 运行 宁 JIT 编译代码的安全系统也需要一些更改(写入异或执行内存页面)。