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

Vin*_*thy 7 cross-platform platform-independent .net-core asp.net-core asp.net-core-3.1

我们都知道.NET Core 是独立于平台的,可以在 Windows、Linux 或 Mac 等任何操作系统上运行。

我只是更好奇地想了解,在 .NET Core 中如何实现跨平台,而在 .NET Framework 中则无法实现跨平台。

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

提前致谢

Mar*_*ich 5

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

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

该操作系统提供了许多低级功能,从通过网络进行文件访问到调度。就像在 C/C++ 中一样,您可能需要在 Windows 上实现与 Linux 或 macOS 不同的实现方式。

.NET Framework 是特定于 Windows 的,因此必须针对 Linux / macOS 抽象并以不同方式实现许多内容以实现兼容性。例如,使用 unix 套接字 API 代替 Winsock 进行网络连接。

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

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

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

另一个很好的例子是全球化支持,因此可以在 .NET 中处理特定于语言的细节。这用于许多字符串操作、字符串格式化(例如,用各种语言格式化月份名称)等等。在 Windows 上,这通常使用本地语言支持API,但对于 Linux 和 macOS,这是使用国际 Unicode 组件 (ICU)库为 .NET Core 实现的。这会导致这些版本之间存在一些行为差异。在 .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 在调用约定(与操作系统和库集成所需)方面有一些细微的差异。此外,围绕运行 JIT 编译代码的安全系统也需要进行一些更改(写入异或执行内存页)。