擁抱.NET Core,如何開發一個跨平臺類庫 (1)

在此前的文章中詳細介紹了使用.NET Core的基本知識,若是尚未看,能夠先去了解「擁抱.NET Core,學習.NET Core的基礎知識補遺」,以便接下來的閱讀。html

在本文將介紹如何配置類庫項目支持不一樣的平臺,併爲不一樣的平臺進行兼容的編碼。json

建立一個.NET Core類庫

首先咱們建立一個.NET Core的類庫項目。app

image

結構以下

image

設置項目支持的平臺

咱們打開「project.json」文件,會看到以下內容:框架

image

其中「framework」就是用來配置所支持的目標,默認爲netstandard1.6。ide

要點回顧

問:netstandard1.6能夠被應用在哪些平臺之上?(這裏你們能夠回憶一下)學習

答:優化

  1. netcoreapp 1.0+(.NET Core)
  2. net4.6.2(.NET Framework)

若是你的答案跟此一致,那麼恭喜你已經基本掌握了各個平臺直接的關係了。編碼

支持net4和netcoreapp

接着咱們想讓類庫支持目標的爲:net4 net45 netcoreapp。.net

根據上一篇的內容咱們能夠了解到,能夠經過下降netstandard版本以來兼容更多的net平臺,其中netstandard1.1就能夠支持net45,也就是說若是咱們把netstandard1.6改成netstandard1.1就能夠達成net45和netcoreapp1.0的支持,(這種方式是理論上最優的,但可能只是一個夢,具體的會在下面的章節指出爲何),看上去像這樣:orm

image

如今這個類庫能夠兼容net45+和netcoreapp1.0+,那麼net40呢?上篇的內容中說net40根本沒有對netstandard作兼容。

是的,net40沒有對netstandard作兼容,因此咱們須要單獨設置一個新的目標,標識類庫同時須要被netstandard和net4使用。

這邊的netstandard和net4是一個互不兼容的分支。修改後文件像這樣子:

image

如何編碼?

設定了不一樣的平臺後,在編碼方式上又有哪些區別?

咱們首先考慮一個問題,net45和net4是同一種性質的實現,只不過前者是後者的升級版,因此net4的大部分代碼net45能夠無縫支持,也就是說基於net4的代碼不須要改動就可讓net45進行支持。

但netstandard是個新目標,其中包含了許多net平臺上沒有的類庫,好比:wcf,System.Web.dll等,那麼改如何在一個項目中與net四、net45共存呢?

咱們來看一下「Class1.cs」代碼文件

image

能夠看到在左上方的下拉框中列出了這個類庫所支持的平臺,點擊選中其中一個平臺能夠設置開發環境爲這個選中的平臺。

接着讓咱們寫個Hello World。

image

這是一個很簡單的寫法,能夠發現Task.FromResult(「rabbit」)不支持net4,那麼咱們就須要利用「條件編譯符」設置在net4環境下的兼容代碼,修改以後看上去以下:

imageimage

根據項目框架選擇的不一樣ide會自動高亮當前生效的代碼。

這樣咱們就完成了GetName方法net4+和netstandard1.1的支持了。

那麼你們在回顧一下如今支持哪些平臺?

  1. net4
  2. net45
  3. net451
  4. net452
  5. net4.6
  6. net4.6.1
  7. net4.6.2
  8. netcoreapp1.0
  9. uap10.0
  10. win8.0
  11. win8.1
  12. wpa8.1
  13. Mono/Xamarin Platforms
  14. mono

是否是一下變得高大上,除了net4外其他的都依靠netstandard的強大支持。

是否是netstandard版本越小越好?

答案是否認的,雖然netstandard能夠兼容更多平臺但有個很致命的缺點就是爲了兼容損失了不少類庫和新特性,好比:

image這個屬性在net4.6以後才被支持也就是說netstandard1.3+纔可使用此屬性。

固然這只是很小的一個例子,還有更多的組件不支持低版本。這意味着你得最更多的兼容操做,而有一些類庫的缺失多是致命的。

因此你們在編寫類庫的時候把我一下兼容的度,通常來講支持.net45+netcoreapp1.0+就能夠了。

看清「framework」的本質

以上的項目開發方式給咱們照成一個錯覺,它就是一個東西,一樣的編碼,一樣的項目文件。

其實不一樣的framework中是徹底獨立的,共享的只是文件而已,framework配置的越多你項目的生成速度越慢

爲何呢?讓咱們看一下vs的輸出窗口。

image

有次能夠看出在生成環境vs將不一樣的framework區別看來,進行單獨生成,上面咱們配置了兩個平臺,vs就執行了兩次生成,項目越大框架越多生成越慢。

因此不要被代表混淆,在進行編碼的時候要記清楚他們是兩個獨立的東西,只不過在開發方式上微軟作出了優化。

寫在最後

本文介紹了開發一個跨平臺類庫的基本作法,接下來會接着介紹:

  1. 不一樣框架直接的依賴(引用的包和程序集)
  2. 如何將.NET Core類庫項目打包成nuget包
  3. 如何讓舊的.NET Framework項目使用這個跨平臺類庫。
  4. 跨平臺類庫不一樣目標中代碼兼容的小技巧
相關文章
相關標籤/搜索