我会这样回答这个问题...
.NET 由 Microsoft 编写,他们已经发布了许多版本(目前为 4.8)。
有很多方法可以考虑 .NET 技术堆栈,但在本文中,.NET 包含以下组件:
- 编译器套件(C#、F#、VisualBasic .NET)
- 基类库 (BCL)
- 运行时(执行编译后的 CIL 所需的位)
创建 Mono 项目是为了实现完全开源的 .NET 克隆。
最初,Mono 自己实现了上述所有功能。例如,有一个 Mono 本机 C# 编译器 ( mcs ),一个 ASP.NET 的 Mono 实现,甚至一个 Windows 窗体的 Mono 实现。随着时间的推移,微软开始以开源的形式发布东西。 Mono 开始合并这一点,因此 Microsoft .NET 和 Mono 开始共享许多共同的代码(例如 Roslyn C# 和 VB.NET 编译器、ASP.NET MVC 和 DLR)。甚至一些 BCL 代码也被开放并在 Mono 和 .NET 之间共享。但不是运行时。
Mono 项目的一些贡献者成立了一家名为 Xamarin 的公司,其目标是使用 Mono 为 iOS 和 Android 等移动操作系统创建应用程序。他们增强并重用了 Mono 运行时(例如添加复杂的 Ahead-of-Time 编译器)。他们还重新使用了 Mono BCL,尽管 BCL 的某些部分无法使用,并且为特定于平台的元素添加了新的 API,尤其是 GUI 的东西。还创建了一个“跨平台”移动 GUI API(称为 Xamarin Forms)。因此,虽然 Microsoft .NET 仅保留 Windows,但 Mono 可用于为 Mac、Linux、Windows、iOS、Android 等创建应用程序。
最近,Microsoft 对 .NET 生态系统进行了并行重新构想。他们将此新版本称为 .NET Core。与 Mono 一样,.NET Core 是开源和多平台的。为了区分这两个 Microsoft 实现,最初的 .NET 被重命名为 .NET Full Framework 或仅命名为 .NET Framework。虽然 .NET Framework 仍然仅适用于 Windows,但 .NET Core 允许应用程序在 Windows、MacOS 和 Linux 上运行。
.NET Core 与 .NET Full Framework 有很多共同点。与 Mono 一样,.NET 核心也使用 Roslyn 编译器套件。然而,BCL 是新的(与 .NET Full Framework 部分不兼容)。运行时是全新的(例如使用 RyuJIT)。
.NET Core 没有“替换”.NET Full Framework。例如,无法使用 .NET Core 创建 Windows 窗体和 Windows Presentation Foundation (WPF) 应用程序。
Mono 项目(例如最新的 6.12 版本)仍然是 .NET Full Framework 的克隆,即使它从 .NET Core 获取代码,目标仍然是 .NET Framework 兼容性。
因此 .NET 发现自己具有多种实现:.NET Framework、.NET Core、Mono 和 Xamarin。所有这些版本都非常相似,但在某种程度上不兼容。 Microsoft 试图通过创建“.NET 标准”的想法来解决这个问题,目的是指定一个共享的功能子集,可以预期在上述任何 .NET 版本上执行。
事实上,.NET 现在还有另一个分支,微软创建了一种名为 Blazor 的东西,它将 .NET 应用程序编译为 Web 程序集 (WASM)。 Blazor 使用 Mono / Xamarin 运行时。
另一个令人困惑的是,.NET Core 计划产生了一些可以在 .NET Core 或 .NET Full Framework 上运行的位。例如,ASP.NET Core 是对 ASP.NET MVC 的重新构想。 ASP.NET Core 是 .NET Core 上唯一的 ASP.NET 版本,但 Mono 和 .NET Framework 开发人员都可以从 ASP.NET Web 窗体、ASP.NET MVC 或 ASP.NET Core 中进行选择。但是,在 ASP.NET Core 本身之外,.NET Core 和 .NET Framework 之间的 BCL 是不同的,因此很有可能创建一个不会在 .NET Core 上运行的 ASP.NET Core 应用程序。还有 Entity Framework Core 也有类似的故事。
总而言之,虽然是一堆很棒的技术,但混杂的版本以及与已变得一团糟的东西一起使用的东西。
.NET 5 和 .NET 6 试图统一并大幅简化上述所有内容。
从最有意义的角度来看,.NET 5 是 .NET Core 的延续,您可以将 .NET 5 视为最新的 .NET Core 版本。但与 .NET Core 不同的是,它不被视为 .NET Full Framework 的“替代”实现。相反,它是 .NET Core 和 .NET Full Framework 的未来。不会有另一个 .NET Core(按名称)或 .NET Full Framework 版本。 Microsoft 从名称中删除了“Core”以表示只有一个 .NET,并且还跳过了第 4 版(.NET Core)以强调第 5 版是 .NET Core 3.1 和 .NET Framework 的升级路径4.8.
由于 .NET 5 旨在取代 .NET Framework,它包含了 .NET Core 不喜欢创建 Windows 窗体和 WPF 应用程序的能力。使用 .NET 5,开发人员现在将对 WPF 应用程序和 Web 应用程序使用相同的 BCL(之前 .NET Framework 和 .NET Core 具有不同版本的 BCL)。在 .NET 5 中,只有一个版本的 ASP.NET (ASP.NET Core)。
遗憾的是,Microsoft 未能完成统一工作,并且使用 .NET 5,您仍然需要 Xamarin(和 Mono)来创建适用于 iOS 和 Android 等移动操作系统的应用程序。这意味着您仍然需要 .NET Standard 来编写可以在两者上运行的代码。
.NET 6 的目标是将 Xamarin 纳入其中。为此,.NET 6 将包含两个不同的运行时:一个来自 .NET Core(例如 RyuJIT),另一个来自 Mono(例如 MonoJIT)。
回到我们上面的列表,我们说过 .NET 有几样东西:
- 编译器套件(C#、F#、VisualBasic .NET)
- 基类库 (BCL)
- 运行时(执行编译后的 CIL 所需的位)
在 .NET 6 中,无论您的目标是什么(Linux、Windows、MacOS、iOS、Android、Blazor / WASM 等),您都可以使用相同的编译器。重要的是,您还使用完全相同的 BCL。甚至已经设想了一个新的跨平台 GUI API 来替代 Xamarin Forms (MAUI),该 API 将适用于所有目标。因此,对于开发人员来说,无论您在构建什么,.NET 6 看起来都是一样的。这意味着您不再需要“.NET Standard”。对于 .NET 6,只有一个 .NET 版本(不是旧版)。
但是,它们仍然是 .NET 6 中的两个运行时:.NET Core 一个和 Mono / Xamarin 的一个。 Windows、Linux 和 MacOS 将使用 .NET Core 运行时来执行 .NET 代码。在 iOS、Android 和 WASM 上,.NET 应用程序将在 Mono 运行时运行。 Mono 存在于 .NET 6 中,但它只是运行时。 Mono BCL 是遗留的,因为 .NET Full Framework BCL 是遗留的。
因此,“假设 Mono 基本上会过时是否公平”这个问题有两个答案:
1 - Mono 不会去任何地方。事实上,它(令人难以置信)将成为 Microsoft 在 .NET 6 及更高版本中发布的官方 .NET 版本的一部分。也就是说,Mono 运行时是 .NET 6 的核心部分。
2 - 完整的 Mono Project 版本(最新版本 6.12)是旧版,因为它模仿 .NET Full Framework 及其现在的旧版 BCL(例如旧的 ASP.NET 设计 - 包括 Web 窗体)。
Microsoft 已将 Mono 运行时复制到不同的 GitHub 存储库(在 Mono 项目管理的 GitHub 项目之外)。据我所知,所有官方开发都是在 Microsoft 存储库中完成的。由于它仍然是开源的,因此代码也可以合并到 Mono Project 项目中。
我不知道 Mono 项目的未来计划是否独立于现在由 Microsoft 维护的 Mono 运行时。在撰写本文时,GitHub 上的 Mono 项目仍然非常活跃。