.NET 5 和单声道

.NET 5 and Mono

.NET 5 被吹捧为 .NET Core 和 .NET Framework 的完全统一,将 运行 Mac、Windows 和 Linux .

Mono 是 .NET Framework 的重新实现,允许 .NET 应用程序在 Linux 上 运行。

因此,假设一旦 .NET 5 被广泛用于新开发,Mono 将基本上被淘汰并且只有遗留应用程序需要它是否公平,或者是否有一些事情仍然需要它?

截至 2020 年 11 月的更新 - .NET 5 发布,统一了 .NET Framework 和 .NET Core

.NET 和 Mono 将在 2021 年 11 月发布的 .NET 6 下统一

  • .NET 6.0 将添加 net6.0-iosnet6.0-android.
  • OS 特定名称可以包含 OS 版本号,例如 net6.0-ios14.

查看以下文章:

我会这样回答问题...

.NET 是由 Microsoft 编写的,他们已经发布了许多版本(目前为 4.8)。

有很多方法可以考虑 .NET 技术堆栈,但是对于此 post,.NET 包含以下组件:

  • 编译器套件(C#、F#、VisualBasic .NET)
  • 基础 Class 库 ( BCL )
  • 运行时间(执行编译后的 CIL 所需的位)

创建 Mono 项目是为了实现完全开源的 .NET 克隆。

最初,Mono 自己实现了上述所有功能。例如,有一个 Mono 本机 C# 编译器 ( mcs ),ASP.NET 的 Mono 实现,甚至 Windows Forms 的 Mono 实现。随着时间的推移,Microsoft 开始以开源形式发布内容。 Mono 开始合并这一点,因此 Microsoft .NET 和 Mono 开始共享许多共同的代码(例如 Roslyn C# 和 VB.NET 编译器,ASP.NET MVC 和 DLR)。甚至一些 BCL 代码也在 Mono 和 .NET 之间开放和共享。但不是 运行 时间。

Mono 项目的一些贡献者成立了一家公司 Xamarin,其目标是使用 Mono 为 iOS 和 Android 等移动操作系统创建应用程序。他们增强并重新使用了 Mono 运行time(例如,添加了一个复杂的 Ahead-of-Time 编译器)。他们还重新使用了 Mono BCL,尽管 BCL 的某些部分无法使用,并且为特定于平台的元素(尤其是 GUI 内容)添加了新的 APIs。还创建了一个“跨平台”移动 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 Forms 和 Windows Presentation Foundation ( WPF ) 应用程序。

Mono 项目(例如最新的 6.12 版本)仍然是 .NET Full Framework 的克隆,即使它从 .NET Core 获取代码,目标仍然是 .NET Framework 兼容性。

因此 .NET 发现自己有多种实现:.NET Framework、.NET Core、Mono 和 Xamarin。所有这些版本都非常相似,但在某种程度上不兼容。 Microsoft 试图通过创建“.NET Standard”的想法来解决这个问题,目的是指定可以在上述任何 .NET 版本上执行的共享功能子集。

事实上,现在还有 .NET 的另一个分支,微软创建了一种叫做 Blazor 的东西,它可以将 .NET 应用程序编译为 Web 程序集 (WASM)。 Blazor 使用 Mono / Xamarin 运行time.

作为另一个层次的混淆,.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 Forms、ASP.NET MVC 或 ASP.NET 核心。尽管在 ASP.NET Core 本身之外,.NET Core 和 .NET Framework 之间的 BCL 是不同的,因此很有可能创建一个不会 运行 在 .NET 上的 ASP.NET Core 应用程序核。还有Entity Framework个有类似故事的核心。

总而言之,虽然技术非常棒,但版本混乱以及与什么一起工作已经变得一团糟。

.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 和 [=96= 等移动操作系统创建应用程序].这意味着您仍然需要 .NET Standard 来编写可以在两者上 运行 的代码。

.NET 6 的目标是将 Xamarin 纳入其中。为此,.NET 6 将包含两种不同的 运行-times:一种来自 .NET Core(例如 RyuJIT),另一种来自 Mono(例如 MonoJIT)。

回到我们上面的列表,我们说 .NET 是一些东西:

  • 编译器套件(C#、F#、VisualBasic .NET)
  • 基础 Class 库 ( BCL )
  • 运行时间(执行编译后的 CIL 所需的位)

在 .NET 6 中,无论您的目标是什么(Linux、Windows、MacOS、iOS、Android、Blazor/WASM 等)。重要的是,您还使用完全相同的 BCL。一个新的跨平台 GUI API 甚至被设想来取代 Xamarin Forms (MAUI),它将适用于所有目标。因此,对于开发人员而言,无论您正在构建什么,.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 运行-time 是.NET 6 的核心部分。

2 - 完整的 Mono Project 版本(最新版本 6.12)是遗留的,因为它模仿 .NET Full Framework 及其现在的遗留 BCL(例如,旧的 ASP.NET 设计——包括 Web 窗体)。

Microsoft 已将 Mono 运行time 复制到另一个 GitHub 存储库(在 Mono 项目管理的 GitHub 项目之外)。据我所知,所有官方开发都是在 Microsoft 存储库中完成的。但是,由于它仍然是开源的,因此代码也可以合并到 Mono Project 项目中。

我不知道 Mono Project 的未来计划与现在由 Microsoft 维护的 Mono 运行time 无关。在撰写本文时,GitHub 的 Mono 项目仍然非常活跃。