前言
有時候,我們從 Nuget 下載第三方包時,會看到這些包的依賴除了要求 .NET FrameWork、.NET Core 等的版本之外,還會要求 .NET Standard 的版本,比如這樣:
這個神秘的 .NET Standard 是什么呢?
.NET Standard 的誕生
在 .NET 的大家庭中有 .NET Framework、.NET Core、Xamarin 等具體的實現,在這些實現中,有一些其他實現所不具有的特性。
比如,.NET Framework 中有訪問 Windows 注冊表的類,很顯然這是其他實現所不具備的;再如,Xamarin 中有撥打電話的類,很顯然這也是其他實現所不具備的。
但是這些實現也有一些可以共享的類,比如讀寫文件的類、List 集合類、字符串類等。如果每個 .NET 實現中,這些可以共享的類都有自己的一套做法,可能就會造成一些問題,比如:
-
有可能出現同樣功能的類在不同的實現中各不相同的情況,比如在 .NET Framework 中操作文件的類叫 FileStream,但是到了 .NET Core 中對應的類叫 Storage,這樣如果我們想開發一個讀寫文件的代碼庫供 .NET Framework、.NET Core 等使用,代碼編寫起來就很麻煩了。
-
由于不同的實現中方法名不一致,我們需要花費更多的時間來理解和修改代碼,代碼會變得難以維護。
-
代碼可讀性就變得更差,代碼閱讀和理解起來變得很困難。
如果能夠這些可以共享的類制定一個規范,無論是 .NET Framework、.NET Core 還是 Xamarin 都要遵守這個規范。比如這個規范規定操作文件的類必須叫 FileStream,而且 FileStream 類必須要有 Read、Write、Flush 等方法,參數和返回值也必須統一,這樣編寫通用庫的時候就會簡單很多了。這個 “各個實現通用的基礎庫規范” 就叫作.NET Standard。
所以,.NET Standard 是一個規范,規定了一系列需要被所有 .NET Core、.NET Framework 及 Xamarin 等共同實現的 API,包括有哪些類、有哪些方法、參數和返回值是什么等。
.NET Standard 和 .NET Core、.NET Framework 對應關系
注意,.NET Standard 只是規定了需要被實現的規范,但是不負責具體實現,對于在 .NET Standard 中規定的類、方法,.NET Core、.NET Framework 及 Xamarin 等必須實現,因此 .NET Standard 相當于定義了 .NET Core、.NET Framework、Xamarin的交集,只要是 .NET Standard 類庫,都可以被 .NET Core、.NET Framework、Xamarin 等項目引用。
.NET Standard 隨著 .NET 技術的升級而升級,不同版本的 .NET Core、.NET Framework 等支持不同版本的 .NET Standard,越高版本的 .NET Core、.NET Framework 等支持的 .NET Standard 版本越高。
以下是 .NET Standard 和 .NET Core、.NET Framework 對應關系:
- .NET Standard 1.0:.NET Core 1.0,.NET Framework 4.5
- .NET Standard 1.1:.NET Core 1.0,.NET Framework 4.5
- .NET Standard 1.2:.NET Core 1.0,.NET Framework 4.5.1
- .NET Standard 1.3:.NET Core 1.0,.NET Framework 4.6
- .NET Standard 1.4:.NET Core 1.0,.NET Framework 4.6.1
- .NET Standard 1.5:.NET Core 1.0,.NET Framework 4.6.1
- .NET Standard 1.6:.NET Core 1.0,.NET Framework 4.6.1
- .NET Standard 2.0:.NET Core 2.0,.NET Framework 4.6.1
- .NET Standard 2.1:.NET Core 3.0
我們可以開發自己的 .NET Standard 類庫嗎?
可以。
如果我們要編寫一個給公眾使用的類庫,為了讓 .NET Core、.NET Framework 等開發人員都能使用這個類庫,那么我們就可以創建自己的 .NET Standard 類庫項目。
開發 .NET Standard 類庫有個小技巧就是先把項目的 .NET Standard 版本選到最低,如果發現開發時用到的類在這個 .NET Standard 版本中不存在,再逐步在項目屬性的 “目標框架” 中提升項目的 .NET Standard 版本,這樣有助于提高這個類庫的可用范圍,因為 .NET Standard 的版本低一些,低版本的 .NET Core、.NET Framework 的項目也能使用這個類庫。
最后
.NET Standard 的版本只到 2.1,從 .NET 5 開始,微軟不再更新 .NET Standard,而是會把 .NET x 等視為單一的代碼庫,通過編譯期和運行時的檢查來解決不同平臺下它們所支持的功能具有差異這一問題。
我是老楊,一個奮斗在一線的資深研發老鳥,讓我們一起聊聊技術,聊聊程序人生,共同學習,共同進步