Dot-Net

.NET 5 和 Mono

  • July 29, 2021

.NET 5 被吹捧為 .NET Core 和 .NET Framework 的完整統一,可在 Mac、Windows 和 Linux 上執行。

Mono 是對 .NET Framework 的重新實現,允許 .NET 應用程序在 Linux 上執行。

因此,假設 Mono 在 .NET 5 被廣泛用於新開發時將基本上過時並且只需要用於遺留應用程序是否公平,或者是否仍然需要它?

我會這樣回答這個問題…

.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 等創建應用程序。

最近,微軟創建了他們自己對 .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。所有這些版本都非常相似,但在某種程度上不兼容。微軟試圖通過創建“.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),它可以在所有目標上執行。因此,對於開發人員來說,無論您在建構什麼,.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 - 單聲道不會去任何地方。事實上,它(令人難以置信)將成為 Microsoft 在 .NET 6 及更高版本中發布的官方 .NET 版本的一部分。也就是說,Mono 執行時是 .NET 6 的核心部分。

2 - 完整的 Mono Project 版本(最近的版本 6.12)是遺留的,因為它模仿 .NET Full Framework 及其現在遺留的 BCL(例如,舊的 ASP.NET 設計 - 包括 Web 窗體)。

Microsoft 已將 Mono 執行時復製到不同的 GitHub 儲存庫(在 Mono Project 管理的 GitHub 項目之外)。據我所知,所有官方開發都是在 Microsoft 儲存庫中完成的。然而,由於它仍然是開源的,因此程式碼也可以合併到 Mono Project 項目中。

我不知道 Mono 項目的未來計劃是什麼獨立於現在由 Microsoft 維護的 Mono 執行時。在撰寫本文時,GitHub 上的 Mono 項目仍然非常活躍。

引用自:https://stackoverflow.com/questions/62905814