.Net基礎體系和跨框架開發普及

  .net體系通過十幾年發展,發生了不少變化。特別是在最近兩年,隨着開源和跨平臺的發展,衍生出不少概念,像標準庫,可移植庫,.Net Core等,相信有很多同窗對他們之間的關係是有一些困惑的,這裏我從基礎概念,跨框架開發的注意事項等,對.net的平臺和相關概念作一個普及分享。此分享是從我的的知識體系中總結,若有不足,歡迎勘誤!linux

一. 基礎概念web

  .Net 自己是一個通用開發平臺,我我的的理解主要分位以下兩個層面:1. 語言層面,2. 運行時編程

  首先:在語言層面上json

  面向 .net 平臺的頂層開發語言有不少,常見的如:C#,F#和Visual Basic等,.net框架提供了這些語言使用的公共語言運行時,運行時與具體的語言無關,它定義了這些語言的公共規範,像類型系統,文件格式等。windows

  這些高級語言編寫的代碼被稱爲託管代碼,這些代碼須要經過編譯器編譯爲中間代碼(IL),而後由公共語言運行時(CLR)接管,再通過JIT編譯爲機器代碼交給cpu運行。api

  公共語言運行時自動處理對象佈局並管理對象引用,當再也不使用對象時釋放它們。 按這種方式實現生存期管理的對象稱爲託管數據。 垃圾回收消除了內存泄漏以及其餘一些常見的編程錯誤。服務器

  其次:運行時層面框架

  當前.net的運行時主要有.Net Framework, Mono for Xamarin和.Net Core 。這些運行時在不一樣是時期主要是爲了解決當時所面臨的問題衍生而出,這裏介紹下他們相互的關聯和職責。佈局

  1. .Net Framework ,這個是自2002年就已存在的.Net運行時,也是如今開發人員還在常用的框架。涵蓋了桌面,web等應用,同時包含了一些特定於windows的api,不過其只能運行在windows平臺的限制,給對跨系統平臺要求較高的開發需求形成很大的困難,很是適合用於桌面應用的開發。spa

  2. Mono for Xamarin ,這個是當時爲了實現.net 的跨系統運行,在2004年非官方組織發佈的一個.Net運行時,當時主要是可以支持在.net framework下編寫的代碼在linux等系統下運行,當前主要包含適用於 iOS、Android、Xamarin.Forms 和 Xamarin.Mac 的 API。 Mono for Xamarin 很是適合生成 iOS 和 Android 移動應用程序。

  3. .Net Core 這個是微軟官方發佈的.Net運行時,主要爲了打破.net framework的系統限制,實現跨操做系統平臺的開發,在必定程序上正在取代後者,官方定義它是 ASP.NET Core 和通用 Windows 平臺 (UWP) 所使用的運行時。 它新式、高效,專用於處理大規模的服務器和雲工做負荷。

  這三個運行時,.Net 開發人員必定要有一個清醒的認識,他們之間的關係見下圖,咱們搞清楚運行時之間的關係以後,就能夠繼續瞭解三者之間類庫框架的關係了

  

二.  跨框架開發介紹

  上邊主要介紹的是當前的.net 平臺的基信息,同時,由於系統支持的不一樣,在不一樣運行時下的支持框架又會有本身不一樣的特性。 特別是在.Net Core 的逐漸成熟,新舊項目的跨框架支持的需求會愈來愈多,如何跨框架類庫共享,舊項目如何擴展支持是個不得不面對的問題。

  如何跨框架開發,微軟在這個問題上前後給出了兩個解決方案,一是建立多目標.net core 項目,第二個是建立可移植類庫(Portable)或標準庫(.Net Standard),第一種方式的實現我會在下邊的實現中講解,這裏先介紹下第二種方式的由來,這兩種在做用上目的是同樣的,只是範圍和方式略微有所不一樣,其中.Net Standard 被認爲是最好的解決方案。

  .Net Standard的官方解釋是:.NET 標準庫是一套正式的 .NET API 規範,有望在全部 .NET 運行時中推出。 推出標準庫的動機是在 .NET 生態系統中創建更好的統一性。 ECMA 335 持續爲 .NET 運行時行爲創建統一性,但適用於 .NET 庫實現的 .NET 基類庫 (BCL) 沒有相似的規範。

  其主要目的就是規範 .net 不一樣運行時下的框架,提出一套能夠通用的api標準。先來看看當前微軟官方框架以及當前版本的詳細信息:

  也就是其餘框架能夠實現本身的特性,但同時也要實現對應的.net standard框架api,那麼就能夠在有需求的框架類庫中直接使用對應版本的.net standard框架的類庫。下邊給出.net standard和其餘框架(圖中叫平臺)的版本對照關係:

  若是咱們須要新建的項目可以同時支持.net core 和 .net framework那麼咱們只須要在vs 2017中新建一個.net standard類庫就行了,若是你使用的是vs2015,那你能夠新建 可移植類庫[英文版對應: Class Library (Portable) ],而後在屬性的窗口下切換到.Net Standard 類庫便可。

  可移植類庫和標準庫目的都是同樣,主要是影響的上有所不一樣,新建可移植類庫是會讓你選擇對應的框架,當前類庫的實現接口取所選框架的交集,而標準庫則和具體框架無關,對應版本的接口都已規範好。

  

三.  跨框架開發實現

  當你須要同時對單一項目提供對.net core 和framework的支持,有兩種狀況咱們能夠選擇,分別是直接創建.net core多目標項目和 創建可移植類庫或者標準庫

  1. 使用多目標.net core 項目

  使用這個方式主要場景是 必須對某些項目提供framework的特殊功能支持,同時又不但願創建兩個獨立的項目。

  這種方式的好處是單個項目可以快速編譯出不一樣的目標版本dll,劣勢是可能沒法在同一解決方案中直接引用當前項目。

  實現方式:

  a. 新建.net core 項目

  b. 修改project.json文件,添加framework的版本,如:

 

  c. 針對特定目標的代碼,直接使用條件編譯符號便可,這裏是對應的目標版本對應關係,也是條件編譯的變量名:

  .NET Framework 2.0 --> net20
  .NET Framework 3.0 --> net30
  .NET Framework 3.5 --> net35
  .NET Framework 4.0 --> net40
  .NET Framework 4.5 --> net45
  .NET Framework 4.5.1 --> net451
  .NET Framework 4.5.2 --> net452
  .NET Framework 4.6 --> net46
  .NET Framework 4.6.1 --> net461
  .NET Framework 4.6.2 --> net462
  .NET Framework 4.6.3 --> net463

  d. 編譯生成便可,能夠去debug文件夾下查看對應目標的dll

  

  2. 使用標準庫或者可移植類庫,這個比較簡單,只是vs2017才支持直接建立標準庫項目,若是在2015中有須要能夠先建立可移植項目,去屬性頁修改目標便可,如圖:

以上是我我的對當前.Net體系下的理解,這裏給出官方的完整平臺圖譜:

 

下篇文章我將實戰演示OSS.Common項目的遷移過程,若是你有興趣,能夠添加公衆號(osscoder):

相關文章
相關標籤/搜索