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