.NET Core 開發一個跨平臺類庫
閱讀目錄
在此前的文章中詳細介紹了使用.NET Core的基本知識,如果還沒有看,可以先去了解“擁抱.NET Core,學習.NET Core的基礎知識補遺”,以便接下來的閱讀。
在本文將介紹如何配置類庫專案支援不同的平臺,併為不同的平臺進行相容的編碼。
建立一個.NET Core類庫
首先我們建立一個.NET Core的類庫專案。
結構如下
設定專案支援的平臺
我們開啟“project.json”檔案,會看到如下內容:
其中“framework”就是用來配置所支援的目標,預設為netstandard1.6。
要點回顧
問:netstandard1.6可以被應用在哪些平臺之上?(這裡大家可以回憶一下)
答:
- netcoreapp 1.0+(.NET Core)
- net4.6.2(.NET Framework)
如果你的答案跟此一致,那麼恭喜你已經基本掌握了各個平臺直接的關係了。
支援net4和netcoreapp
接著我們想讓類庫支援目標的為:net4 net45 netcoreapp。
根據上一篇的內容我們可以瞭解到,可以通過降低netstandard版本以來相容更多的net平臺,其中netstandard1.1就可以支援net45,也就是說如果我們把netstandard1.6改為netstandard1.1就可以達成net45和netcoreapp1.0的支援,(這種方式是理論上最優的,但可能只是一個夢,具體的會在下面的章節指出為什麼
現在這個類庫可以相容net45+和netcoreapp1.0+,那麼net40呢?上篇的內容中說net40根本沒有對netstandard做相容。
是的,net40沒有對netstandard做相容,所以我們需要單獨設定一個新的目標,標識類庫同時需要被netstandard和net4使用。
這邊的netstandard和net4是一個互不相容的分支。修改後檔案像這樣子:
如何編碼?
設定了不同的平臺後,在編碼方式上又有哪些區別?
我們首先考慮一個問題,net45和net4是同一種性質的實現,只不過前者是後者的升級版,所以net4的大部分程式碼net45可以無縫支援,也就是說基於net4的程式碼不需要改動就可以讓net45進行支援。
但netstandard是個新目標,其中包含了許多net平臺上沒有的類庫,比如:wcf,System.Web.dll等,那麼改如何在一個專案中與net4、net45共存呢?
我們來看一下“Class1.cs”程式碼檔案
可以看到在左上方的下拉框中列出了這個類庫所支援的平臺,點選選中其中一個平臺可以設定開發環境為這個選中的平臺。
接著讓我們寫個Hello World。
這是一個很簡單的寫法,可以發現Task.FromResult(“rabbit”)不支援net4,那麼我們就需要利用“條件編譯符”設定在net4環境下的相容程式碼,修改之後看上去如下:
根據專案框架選擇的不同ide會自動高亮當前生效的程式碼。
這樣我們就完成了GetName方法net4+和netstandard1.1的支援了。
那麼大家在回顧一下現在支援哪些平臺?
- net4
- net45
- net451
- net452
- net4.6
- net4.6.1
- net4.6.2
- netcoreapp1.0
- uap10.0
- win8.0
- win8.1
- wpa8.1
- Mono/Xamarin Platforms
- mono
是不是一下變得高大上,除了net4外其餘的都依靠netstandard的強大支援。
是不是netstandard版本越小越好?
答案是否定的,雖然netstandard可以相容更多平臺但有個很致命的缺點就是為了相容損失了很多類庫和新特性,比如:
這個屬性在net4.6之後才被支援也就是說netstandard1.3+才可以使用此屬性。
當然這只是很小的一個例子,還有更多的元件不支援低版本。這意味著你得最更多的相容操作,而有一些類庫的缺失可能是致命的。
所以大家在編寫類庫的時候把我一下相容的度,一般來說支援.net45+netcoreapp1.0+就可以了。
看清“framework”的本質
以上的專案開發方式給我們照成一個錯覺,它就是一個東西,同樣的編碼,同樣的專案檔案。
其實不同的framework中是完全獨立的,共享的只是檔案而已,framework配置的越多你專案的生成速度越慢。
為什麼呢?讓我們看一下vs的輸出視窗。
有次可以看出在生成環境vs將不同的framework區別看來,進行單獨生成,上面我們配置了兩個平臺,vs就執行了兩次生成,專案越大框架越多生成越慢。
所以不要被表明混淆,在進行編碼的時候要記清楚他們是兩個獨立的東西,只不過在開發方式上微軟做出了優化。