在此前的文章中詳細介紹了使用.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就執行了兩次生成,項目越大框架越多生成越慢。
所以不要被表明混淆,在進行編碼的時候要記清楚他們是兩個獨立的東西,只不過在開發方式上微軟做出了優化。
寫在最后
本文介紹了開發一個跨平台類庫的基本做法,接下來會接着介紹:
- 不同框架直接的依賴(引用的包和程序集)
- 如何將.NET Core類庫項目打包成nuget包
- 如何讓舊的.NET Framework項目使用這個跨平台類庫。
- 跨平台類庫不同目標中代碼兼容的小技巧
- 等