如今各類 .NET 滿天飛,別說新手了,連我這樣的老手都差點被繞進去。到底什麼是 .NET 呢?通俗易懂,什麼是.NET?什麼是.NET Framework?什麼是.NET Core? 這篇文章好長呀,不知道你看完了沒有,其實最關鍵的是核心的幾個概念,咱們從頭梳理一下天然就清楚了。html
遠在 2000 年的時候,微軟就發佈了 .NET 1.0。而後在 2001 年的時候就成爲了國際標準。git
標準是須要實現的,微軟對這個標準的第一個實現就是 .NET Framework,也是多年來咱們所熟悉的 .NET。可是,這個 .NET 的實現是基於 Windows 平臺的,其中包含了大量基於 Windows 的實現,甚至許多 Windows 專有的內容,好比 GDI 支持等等。微軟從前推廣的 .NET 跨平臺,其實,是在微軟平臺上的跨平臺。因爲 .NET Framework 是直接基於 Windows 平臺的,因此,.NET Framework 的程序是不能真正跨平臺的,好比運行在 Linux 上。github
.NET 確實是一個很是優秀的設計,它吸引了大量的開發者,因此,世界上還存在着許多其它的 .NET 實現。他們本身開發了基於 .NET 標準的其它實現,例如,很是著名的 Mono 就是一個由 Xamarin 公司(先前是Novell,最先爲Ximian)所主持的自由開放源代碼項目。windows
可是,包括微軟本身的 .NET Framework 在內的各類 .NET 實現,看起來都是 .NET,甚至均可以使用 C# 來開發程序,都是面向對象的,實際上是各不兼容的,好比它們的底層所支持的 API 就各不相同。這致使的結果就是,你在各個平臺上開發的程序集實際上是沒法通用的。由於對於某個 API 來講,有的平臺支持,有的平臺就不支持。post
雖然開發人員能夠經過條件編譯等手段來開發能夠支持在各類 .NET 實現上通用的類庫,顯然這是一個艱鉅的任務,你必需要清楚各個實現的各個版本到底支持了哪些 API。url
到 2014 年的時候,微軟的策略轉向了開源和跨平臺,.NET Framework 顯然沒法作到這一點,.NET Core 橫空出世,它是開源,徹底跨平臺的 .NET 實現,也是微軟的第二個主要 .NET 實現。如今問題來了,即便對於微軟來講,如今都有了兩個主要的 .NET 實現了,到底哪一個是正宗的 .NET 的呢?spa
計算機領域有個概念,若是你不能統一它,就增長一個抽象層。微軟又搞出一個 .NET Standard 的新概念。開放源代碼
顧名思義,.NET Standard 就是 .NET 的標準,它是一組規範,定義了在 .NET 的實現中到底應該包括哪些 API ,你能夠在這裏查看這個標準的官方說明。其中的要點以下:設計
它的好處在於,開發人員不用再逐個平臺的檢查是否支持某個 API 了,只要看這個平臺支持到了 .NET Standard 的哪一個版本就好了,只要目標平臺支持某個 .NET Standard ,就能夠確認你的類庫能夠跨 .NET 實現通用了。越高的 .NET Standard 版本包含的 API 越多,但通用性越差,由於不是全部的平臺都支持這麼多的 API,顯然,越低的 .NET Standard 兼容性越好,由於它要求的 API 越少,因此,支持的平臺也越多。orm
對於開發人員來講,有了這個 .NET Standard,開發通用的類庫天然簡單多了。
微軟給出了一個各個常見平臺各個版本所支持的 .NET Standard 標準的列表。
.NET Standard. | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 2.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 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% 的支持度。
一圖勝千言