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

标签 asp.net-core .net-core cross-platform asp.net-core-3.1 platform-independent

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

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

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

提前致谢

最佳答案

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

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

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

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

另请注意,垃圾收集使用了更高级的内存和调度 API,它们在所有平台上也并非 1:1 存在,因此存在实现差异。

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

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

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

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

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

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

关于asp.net-core - .NET Core 是如何实现跨平台或平台无关的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65120971/

相关文章:

docker - ASP.NET Core + Docker -> 在本地网络上可用

asp.net-core - ASP.NET 5 中的 Request.IsAuthenticated 函数

c# - 如何在 ASP.NET Core 中手动生成防伪 token

c# - 调整用作水印的位图大小,结果显示黑色边框

c# - 为什么在 .NET 生态系统的标准事件模式中没有将 TEventArgs 设为逆变?

.net - Mono 和 TransactionScope

docker - 无法使用 Visual Studio 2017 调试我的 Docker 容器

c# - 如何在 dotnet core 中动态加载程序集

java - 如何处理不同计算机之间的 Java 2D 性能差异?

python - 跨平台 Python 扫描器接口(interface)