一文看懂.NET的各種變體

程序員之家2018-07-21 10:48:38

作者 | Wayne Citrin
譯者 | 無明
關鍵要點
  • 不同平臺的.NET 者已經有了通用的開發工具:VS Code、Mac 版 Visual Studio 和 Windows 版 Visual Studio。

  • .NET Standard 為開發者提供了特定.NET 平臺的 API 指南。

  • .NET Core 開發者可以選擇 macOS、Linux、Windows 或三種兼而有之。

  • .NET Core 是開源的,由公開開發。

  • .NET Framework 仍然是微軟在背後,主要面向專門針對 Windows 平臺開發的開發者。

曾幾何時,我們只有一個.NET,叫作.NET Framework。如果想要開發.NET ,只要使用.NET Framework 即可,非常簡單。幾年之後,出現了.NET 變種的寒武紀大爆發(我們稱之為“.NET 大爆炸”):.NET Framework Client Profile、.NET Compact Framework、.NET Micro Framework、Windows Runtime、Universal Windows Platform、Mono、Xamarin、.NET Core 和.NET Standard。

就像來自寒武紀大爆發的有機體一樣,.NET 的很多變種最終都已經滅絕:它們不再被支持或不再被更新。有些變種只有一點點的立足之地,被用在非常專業化的領域。還有一些變種(“.NET 倖存者”)蓬勃發展,目前正在發展壯大,因為一些特定的原因和用途。本文的目標不是要深入到各種.NET 的技術細節中,關於技術細節已經有大量的技術資源可參考。相反,本文的目的是澄清一個簡單的問題:在特定情況下應該使用哪種.NET?

.NET Framework

.NET Framework 是最初的.NET 實現,其他所有.NET 都來自它。無論是支持的 API 數量還是下載量,它都是.NET 中最大的一個。多年來,.NET Framework 發佈了很多版本,每個版本都增加了新的 API 和功能。.NET Framework 由微軟開發和支持,並且只能在 Windows 上運行。

如果你的應用程序只在 Windows 上運行,那麼就應該使用.NET Framework。由於它支持的 API 數量最多,因此如果選擇了.NET Framework,就無需擔心是否可以輕鬆完成一些複雜的任務。不過,如果你希望應用程序從一開始就在 Windows 以外的平臺上運行,或者希望將來在非 Windows 平臺上運行應用程序,那麼就要考慮使用不同的.NET 類型。

Mono

Mono 是.NET 的一個開放源代碼實現,旨在與.NET Framework 兼容,但可以在不同的平臺上運行,包括 Windows、MacOS 和 Linux。該項目由愛好者創建,並由 Miguel de Icaza 領導,他相信.NET 的優勢也應該被移植到除 Windows 之外的平臺上,而實現這一目標的最佳方式就是開源。Mono 的管理權隨著 de Icaza 從一家公司遷移到另一家公司:從 Ximian 到 Novell,再到 Xamarin,最後到了微軟。

Mono 覆蓋到的.NET API 並不完整,但已經很好了。從.NET Framework 移植到 Mono 非常簡單,即使是在 API 覆蓋不到位的情況下,也有相對簡單的解決方法。

Mono 仍然是跨平臺.NET 的可行之選,儘管微軟似乎將大部分跨平臺.NET 工作轉移到了.NET Core 中。所以如果你對.NET 的未來有所期待,應該要考慮到這一點。此外,Xamarin/ 微軟現在似乎將他們 Mono 的大部分工作集中在 Xamarin 平臺和支持 iOS 和 Android 上,儘管 Mono 對桌面和服務器平臺的支持似乎也很活躍。總之,如果你有一個運行在 Windows 上的.NET Framework 應用程序,並且希望你的應用程序支持 Windows、macOS、Linux、BSD 等平臺,但只想花費很少的精力來轉換你的應用程序,那麼 Mono 可能是你最好的選擇。

.NET Core

.NET Core 是另一個開源的跨平臺.NET 實現,由微軟領銜。它支持 Windows、MacOS 和 Linux。最初,.NET Core 是一個輕量級的實現:強大到足以支持 ASP.NET 和控制檯應用程序,但又不會太過。後來,它擴展到可以支持 Windows、macOS 和 Linux 上的 API 子集,但不支持 Windows 特有的註冊表等東西。在這一點上,API 的覆蓋範圍似乎已經進一步擴大了,所以它幾乎就像.NET Framework 的翻版,儘可能完整地支持多個平臺,同時避免支持微軟似乎不再需要的 API(如.NET Remoting)。像 Windows Forms 和 WPF 這樣的 UI API 也不受支持(微軟已經宣佈下一個版本的.NET Core 將支持桌面應用程序編程,包括 Windows Forms 和 WPF,但這隻適用於 Windows 上運行應用程序)。

由於.NET Core 似乎是跨平臺.NET 的未來,如果你正在開發在 Windows、MacOS 或 Linux 上運行的應用程序,而且不是非 Web 界面(Windows Forms 和 WPF 不可用),那麼我建議使用.NET Core。它可能沒有.NET Framework 那麼多的 API,但如果你從頭開始開發應用程序,則可以考慮使用這種佔用較小空間的 API。但是,如果你想讓現有的.NET Framework 支持跨平臺,遷移到.NET Core 可能會是一個沉重的負擔,因為它可能不支持一些關鍵 API。請注意,微軟試圖通過 Windows 兼容包等產品來緩解這種情況,Windows 兼容包為.NET Core 中的 Windows 特定 API 提供支持。但是,如果你使用了這些 API,則仍然被鎖定在 Windows 中,至少在.NET Core 提供這些 API 之前是這樣的,或者可以通過重寫代碼移除對它們的依賴。

.NET Standard

.NET Standard 是另一個支持跨平臺的.NET 變種。與.NET Framework、Mono 和.NET Core 不同,它不是一個包含運行時和庫的完整軟件包。相反,它是一個 API 規範,.NET 的實現需要基於這一規範——特別是.NET Framework、.NET Core 和 Xamarin(微軟支持的面向 iOS、Android 和 macOS 的 Mono 分支)。目的是讓基於.NET Standard 實現的庫可以在任意.NET 平臺應用程序中運行。.NET Standard 僅支持庫,而不是應用程序,所以可以用它開發可在任何地方運行的庫。

最新版本的.NET Standard 2.0 覆蓋了更廣的 API,但仍有大量缺失。它幾乎涵蓋了.NET Core,但缺失了相當數量的.NET Framework API。當然,你沒有理由非要使用那些缺少的 API,但如果你選擇了.NET Framework,而不是.NET Standard,那麼在移除那些 API 依賴之前,你會鎖定在.NET Framework 上。

如果你正在開發一組新庫,我會建議你選擇.NET Standard。這樣,你的庫就可以運行在.NET Framework、.NET Core 或 Xamarin 上,而不需要做額外的工作。當然,你一定會創建針對特定.NET 變體的應用程序,但如果應用程序足夠小,而且包含.NET Standard 不支持的 GUI 類,並且將大部分功能都放在共享庫中,那麼應該能夠最大程度地獲得跨平臺好處。由於缺乏某些 API,遷移現有的.NET Framework 代碼可能會涉及更多工作,但即使是這樣,仍然可以將盡可能多的代碼遷移到.NET Standard 庫,並隔離平臺特定代碼。在跨平臺場景中可能會用到你的.NET Standard 庫,並且隨著時間的推移,你可以花費額外的精力將其餘代碼遷移到.NET Standard。

關於工具的簡要說明

一直以來,每個.NET 變體都有自己的專用開發工具。Visual Studio 用於.NET Framework 開發,MonoDevelop 用於 Mono 開發,Visual Studio Code 主要用於.NET Core 開發。到了最近,這些界限開始漸漸模糊。除.NET Framework 之外,現在可以使用 Visual Studio 開發 Xamarin、.NET Core 和.NET Standard。Visual Studio Code 最初是一個源代碼編輯器,但現在已經成為一個更加完整的開發環境,可用於開發.NET Framework 或.NET Core。Xamarin Studio(基於 MonoDevelop)已被 Windows(他們推薦使用 Visual Studio)棄用,現在變成 Visual Studio for Mac,可用於開發 Xamarin 或.NET Core。因此,除非你正在開發.NET Framework(在這種情況下應該使用 Visual Studio),否則可以根據其他需求選擇合適的環境。

結   論

.NET“大爆炸”產生了很多.NET 變體,其中一些已經消亡,其他一些則佔據了非常狹小的市場空間,另一些正在蓬勃發展。蓬勃發展的.NET 變種之間的相似性足以讓開發者感到困惑,並且不確定要使用哪一個,但其實在它們之間做出選擇很簡單。如果你要創建一個只能在 Windows 上運行的應用程序,請使用原始的.NET Framework。如果你希望應用程序能夠在多個平臺上運行,並且需要接近完整的.NET Framework API,請使用 Mono。如果將現有的.NET Framework 應用程序遷移到 Windows 以外的其他平臺,Mono 也是一個很好的選擇。如果你創建的跨平臺應用程序可以使用.NET Core 提供的不完整 API,那麼可以考慮.NET Core。最後,可以考慮使用.NET Standard 創建可在.NET Framework、.NET Core 或 Xamarin 上運行的庫,並在面向特定平臺的組件中隔離面向特定平臺的部分,例如用戶界面。

  本文轉載自【infoQ】

  原文鏈接:https://www.infoq.com/articles/varieties-dotnet


公眾號內回覆“1”帶你進粉絲群

閱讀原文

TAGS: