1. 程式人生 > >一文搞清到底什麽是 .NET?

一文搞清到底什麽是 .NET?

額外 one 跨平臺 世界 需要 -c ima 計算 一點

現在各種 .NET 滿天飛,別說新手了,連我這樣的老手都差點被繞進去。到底什麽是 .NET 呢?通俗易懂,什麽是.NET?什麽是.NET Framework?什麽是.NET Core? 這篇文章好長呀,不知道你看完了沒有,其實最關鍵的是核心的幾個概念,我們從頭梳理一下自然就清楚了。

.NET Framework 時代

遠在 2000 年的時候,微軟就發布了 .NET 1.0。然後在 2001 年的時候就成為了國際標準。

標準是需要實現的,微軟對這個標準的第一個實現就是 .NET Framework,也是多年來我們所熟悉的 .NET。但是,這個 .NET 的實現是基於 Windows 平臺的,其中包含了大量基於 Windows 的實現,甚至許多 Windows 專有的內容,比如 GDI 支持等等。微軟從前推廣的 .NET 跨平臺,其實,是在微軟平臺上的跨平臺。由於 .NET Framework 是直接基於 Windows 平臺的,所以,.NET Framework 的程序是不能真正跨平臺的,比如運行在 Linux 上。

多樣化的 .NET 實現

.NET 確實是一個非常優秀的設計,它吸引了大量的開發者,所以,世界上還存在著許多其它的 .NET 實現。他們自己開發了基於 .NET 標準的其它實現,例如,非常著名的 Mono 就是一個由 Xamarin 公司(先前是Novell,最早為Ximian)所主持的自由開放源代碼項目。

但是,包括微軟自己的 .NET Framework 在內的各種 .NET 實現,看起來都是 .NET,甚至都可以使用 C# 來開發程序,都是面向對象的,其實是各不兼容的,比如它們的底層所支持的 API 就各不相同。這導致的結果就是,你在各個平臺上開發的程序集其實是無法通用的。因為對於某個 API 來說,有的平臺支持,有的平臺就不支持。

雖然開發人員可以通過條件編譯等手段來開發可以支持在各種 .NET 實現上通用的類庫,顯然這是一個艱巨的任務,你必須要清楚各個實現的各個版本到底支持了哪些 API。

.NET Standard 和 .NET Core

到 2014 年的時候,微軟的策略轉向了開源和跨平臺,.NET Framework 顯然無法做到這一點,.NET Core 橫空出世,它是開源,完全跨平臺的 .NET 實現,也是微軟的第二個主要 .NET 實現。現在問題來了,即使對於微軟來說,現在都有了兩個主要的 .NET 實現了,到底哪個是正宗的 .NET 的呢?

計算機領域有個概念,如果你不能統一它,就增加一個抽象層。微軟又搞出一個 .NET Standard 的新概念。

顧名思義,.NET Standard 就是 .NET 的標準,它是一組規範,定義了在 .NET 的實現中到底應該包括哪些 API ,你可以在這裏查看這個標準的官方說明。其中的要點如下:

  • 為所有的 .NET 實現定義一組統一的基礎類庫支持的 API
  • 使得開發人員能夠基於這個標準開發可以在各種 .NET 中使用的可移植庫

它的好處在於,開發人員不用再逐個平臺的檢查是否支持某個 API 了,只要看這個平臺支持到了 .NET Standard 的哪個版本就行了,只要目標平臺支持某個 .NET Standard ,就可以確認你的類庫可以跨 .NET 實現通用了。越高的 .NET Standard 版本包含的 API 越多,但通用性越差,因為不是所有的平臺都支持這麽多的 API,顯然,越低的 .NET Standard 兼容性越好,因為它要求的 API 越少,所以,支持的平臺也越多。

對於開發人員來說,有了這個 .NET Standard,開發通用的類庫自然簡單多了。

微軟給出了一個各個常見平臺各個版本所支持的 .NET Standard 標準的列表。

.NET Standard.1.01.11.21.31.41.51.62.0
.NET 核心.NET Core 1.01.0 1.01.0 1.01.0 1.01.0 1.01.0 1.01.0 1.01.0 2.02.0
.NET Framework 1.NET Framework 1 4.54.5 4.54.5 4.5.14.5.1 4.64.6 4.6.14.6.1 4.6.14.6.1 4.6.14.6.1 4.6.14.6.1
MonoMono 4.64.6 4.64.6 4.64.6 4.64.6 4.64.6 4.64.6 4.64.6 5.45.4
Xamarin.iOSXamarin.iOS 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.1410.14
Xamarin.MacXamarin.Mac 3.03.0 3.03.0 3.03.0 3.03.0 3.03.0 3.03.0 3.03.0 3.83.8
Xamarin.AndroidXamarin.Android 7.07.0 7.07.0 7.07.0 7.07.0 7.07.0 7.07.0 7.07.0 8.08.0
通用 Windows 平臺Universal Windows Platform 10.010.0 10.010.0 10.010.0 10.010.0 10.010.0 10.0.1629910.0.16299 10.0.1629910.0.16299 10.0.1629910.0.16299
WindowsWindows 8.08.0 8.08.0 8.18.1
Windows PhoneWindows Phone 8.18.1 8.18.1 8.18.1
Windows Phone SilverlightWindows Phone Silverlight 8.08.0

.NET Core 與 .NET Framework 的選擇

.NET Framework 和 .NET Core 都是 .NET,只不過它們支持的 API 並不完全一致。開發人員更加頭疼了,都是微軟的親兒子,我們應該選哪個呢?

從支持程度來看,微軟主要在推廣 .NET Core,以支持跨平臺應用,對 .NET Framework 的支持倒在其次。
.NET Core 從 2.0 開始追上 .NET Framework 的 API 數量,達到支持 .NET Standard 2.0 水平,更新速度明顯快於 .NET Framework。剛剛發布的 .NET Core 2.1 中支持了 Span<T>,這個特性到明年的 .NET Framework 4.8 都不會支持。所以,新應用的開發應該首選 .NET Core。

不過,有一個問題你不得不考慮一下,.NET Core 是跨平臺的,必須支持所有平臺,因此,它不可能包含 Windows 特定的一些 API,比如註冊表的訪問,所以。理論上講,如果你希望在開發中使用一些 Windows 平臺專員的 API,它是不會出現在 .NET Core 中的。

別擔心,微軟在 .NET 2.0 開始,微軟提供了 Microsoft.Windows.Compatibility 來解決這個問題,該包提供了額外的約 20000 API 以支持 Windows 平臺。可以在 .NET Core 項目中,添加對這個包的引用。
Windows 兼容性包通過 NuGet 包 Microsoft.Windows.Compatibility 提供,可從面向 .NET Core 或 .NET Standard 的項目引用。它提供了約 20,000 個 API 以支持原來在 .NET Framework 中支持,但是在 .NET Standard 中沒有的 API。

對於 NuGet 庫中的包來說,在發布於 2017/8/14 的 Announcing .NET Core 2.0 中,已經達到了約 70% 的支持度。

總結

  • 對於 .NET 來說,首先要認識到 .NET Standard 是 .NET 的標準,這個標準有自己版本號,目前的版本是 2.0。
  • 在這個 .NET Standard 標準之下,有許多 .NET 的實現,比較著名的就是 .NET Framework 和 .NET Core 了,它們各自有各自的實現版本,目前 .NET Framewrok 是 4.7.2,而 .NET Core 則是 2.1。查看這裏的說明。
  • API 最豐富的就是 .NET Framework 了,不過它僅支持 Windwos 平臺。
  • .NET Core 的 2.1 版本,加上 Microsoft.Windows.Compatibility 這個包,已經很接近 .NET Framework 的支持水平,NuGet 中的類庫也已經絕大多數支持了 .NET Core, 微軟還在瘋狂的填補這個差距。
  • 如果是新的項目,強烈建議基於 .NET Core 開發
  • 當前使用 Visual Studio 和 Visual Studio Code 都可以開發 .NET Core 應用

一圖勝千言

技術分享圖片

一文搞清到底什麽是 .NET?