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

来源:http://www.cnblogs.com/sunhoy/archive/2017/02/06/6371178.html
-Advertisement-
Play Games

.net體系經過十幾年發展,發生了很多變化。特別是在最近兩年,隨著開源和跨平臺的發展,衍生出很多概念,像標準庫,可移植庫,.Net Core等,相信有不少同學對他們之間的關係是有一些困惑的,這裡我從基礎概念,跨框架開發的註意事項等,對.net的平臺和相關概念做一個普及分享。此分享是從個人的知識體系中 ...


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

一. 基礎概念

  .Net 本身是一個通用開發平臺,我個人的理解主要分位如下兩個層面:1. 語言層面,2. 運行時

  首先:在語言層面上

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

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

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

  其次:運行時層面

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

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

  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):

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • --創建資料庫 create database ShoppingManageon( --資料庫文件名稱 name = 'ShoppingManage.mdf', --資料庫路徑(包含資料庫文件名稱) filename = 'E:\資料\Data\ShoppingManage.mdf') --刪除數據 ...
  • 使用指定的埠名、波特率、奇偶校驗位、數據位和停止位初始化 SerialPort 類的新實例 使用緩衝區中的數據將指定數量的位元組寫入串列埠 "【SerialPort相關參考】" .aspx) ...
  • 在學習泛型時遇到的困惑經常與func<T,U>混淆,總認為最後一個值是返回類型。現在區分一下,原來問題出在泛型委托上。 C#委托的介紹(delegate、Action、Func、predicate) 委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞。事件是一種特殊的委托 ...
  • 簡單的應用場景:分頁獲取日誌JSON信息。 很簡單的實現,簡單的記錄一下 未壓縮時候 使用PostMan請求http://localhost:34390/api/gpm/syslog/page?pageindex=1&pagesize=10 上圖用到了一些技術:AOP、IOC、Request/Res ...
  • 本文供實習司機快速上手log4net最基本功能,共4步,3分鐘搞定。 一、添加log4net.dll引用,可使用nuget安裝或直接引用文件 二、添加配置 在app.config或web.config添加如下配置。註意<configSections> 必須放在最上方。 三、項目AssemblyInf ...
  • 1. 概述 依賴屬性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一種特殊的屬性。由於UWP的幾乎所有UI元素都是集成於DependencyObject的FramewordElement,並且這些UI元素的幾乎所有屬性及它們出現在XAML中的 ...
  • 本篇博客轉載:http://www.cnblogs.com/freeliver54/archive/2009/02/11/1388173.html 本次示例效果如下:Form1為父窗體(包含textBox1、button1)Form2為子窗體(包含textBox2、button2) 父窗體給子窗體傳 ...
  • 和大家分享下當前OSS開源項目的進度情況: 一. OSS.Common 【開源中國】 【github】 經過昨天的努力,oss.common項目初步完成了對.net standard的支持,遷移過程本周以新文章的形式開放給大家,當前解決方案有兩個: OSS.Common.NET40 - 針對原來.n ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...