­

.NET6 平台系列2 .NET Framework框架詳解

什麼是 .NET Framework?

  .NET Framework 是 Windows 的託管執行環境,可為其運行的應用提供各種服務。 它包括兩個主要組件:公共語言運行時 (CLR),它是處理運行應用的執行引擎;.NET Framework 類庫,它提供開發人員可從其自己的應用中調用的已測試、可重用程式碼庫。 .NET Framework 提供的用於運行應用的服務包括:

  • 記憶體管理。 在許多程式語言中,程式設計師負責分配和釋放記憶體並處理對象生存期。 在 .NET Framework 應用中,CLR 代表應用提供這些服務。

  • 常規類型系統。 在傳統程式語言中,基本類型由編譯器定義,這將使跨語言互操作性複雜化。 在 .NET Framework 中,基本類型由 .NET Framework 類型系統定義,並且是面向 .NET Framework 的所有語言所共有的。

  • 一個全面的類庫。 處理常見的低級編程操作時,程式設計師可通過 .NET Framework 類庫使用類型及其成員的易訪問庫,而不必編寫大量程式碼。

  • 開發框架和技術。 .NET Framework 包括用於特定區域應用開發的庫,例如用於 Web 應用的 ASP.NET、用於數據訪問的 ADO.NET、用於面向服務的應用的 Windows Communication Foundation,以及用於 Windows 桌面應用的 Windows Presentation Foundation。

  • 語言互操作性。 面向 .NET Framework 的語言編譯器發出名為公共中間語言 (CIL) 的中間程式碼,反過來,通過公共語言運行時在運行時進行編譯。 藉助此功能,使用某種語言編寫的常式可由另一種語言訪問,程式設計師可以專註於使用其首選語言創建應用。

  • 版本兼容性。 除少數例外,使用特定版本的 .NET Framework 開發的應用無需在更高版本中修改即可運行。

  • 並行執行。 通過允許同一台電腦上存在公共語言運行時的多個版本,.NET Framework 可幫助解決版本衝突。 這意味著應用的多個版本可以共存,並且應用可在構建它的 .NET Framework 版本上運行。 並行執行適用於 .NET Framework 版本組 1.0/1.1、2.0/3.0/3.5 和 4/4.5.x/4.6.x/4.7.x/4.8。

  • 多定向。 通過面向 .NET Standard,開發人員可創建適用於該標準版本支援的多種 .NET Framework 平台的類庫。 例如,面向 .NET Framework 4.6.1、NET Core 2.0 和 UWP 10.0.16299 的應用可以使用面向 .NET Standard 2.0 的庫。

.NET Framework 設計目標

  .NET Framework 是一種技術,支援生成和運行 Windows 應用及 Web 服務。 NET Framework 旨在實現下列目標:

  • 提供一個一致的面向對象的編程環境,而無論對象程式碼是在本地存儲和執行,還是在本地執行但在 Web 上分布,或者是在遠程執行。

  • 提供可執行以下操作的程式碼執行環境:

    • 將軟體部署和版本控制衝突最小化。

    • 提高程式碼(包括由未知的或不完全受信任的第三方創建的程式碼)執行安全性。

    • 消除腳本環境或解釋環境的性能問題。

  • `使開發人員的經驗在面對類型大不相同的應用(如基於 Windows 的應用和基於 Web 的應用)時保持一致。
  •  按照工業標準生成所有通訊,確保基於 .NET Framework 的程式碼可與任何其他程式碼集成。
.NET Framework 框架組成

  .NET Framework 是運行在 Windows 系列作業系統上的一個系統應用程式。它是 .NET 的核心部分,提供了建立和運行 .NET 應用程式所需要的編輯、 編譯等核心服務。它包括2個重要組成部分:公共語言運行時 (Common Language Runtime,CLR) 和 .NET Framework 類庫(Framework Class Library,FCL)。下圖顯示公共語言運行時和類庫與應用之間以及與整個系統之間的關係。 該圖還顯示託管程式碼如何在更大的結構內運行。

.NET Framework = CLR + FCL

 

 下圖展示了 .NET Framework 框架更加詳細的組成與層次結構

.NET Framework = CLR + BCL + Application Model

 

· OS

  作業系統。 

  .NET Framework 從設計之初就是以微軟自家的 Windows 系統為基礎,提供的API與Windows系統底層介面緊密關聯。所以 .NET Framework 只能運行在 Windows Server 與 Windows PC上。

· CTS

    

  CLR 一切圍繞類型展開。類型嚮應用程式和其他類型公開了功能。通過類型,用一種程式語言寫的程式碼能與另一種語言寫的程式碼溝通。由於類型是 CLR 的根本,所以微軟制定了一個正式的規範來描述類型的定義和行為,這就是「通用類型系統」(Common Type System,CTS)。

  CTS 提供了2種類型:引用類型、值類型。

  • CTS 規範規定,一個類型可以包含零個或多個成員。這些成員包括:欄位(Field)、屬性(Property)、方法(Method)、事件(Event)。
  • CTS 指定了類型可見性規則以及類型成員的訪問規則。private、public 等。
  • CTS 還為類型繼承、虛方法、對象生存期等定義了相應的規則。
  • CTS 規定:所有類型最終必須從預定義的 System.Object 類型繼承。

  為了實現語言的互操作性,.NET Framework 採用以下的兩種方法來解決語言的劃分問題。
      (1)標準化數據類型。建立通用語言運行環境中的通用類型系統(CTS),它為最常用的數據類型(如整數、實數、文本字元等)定義了標準的內部描述和運算,並提供了將這些類型向所有的.NET語言和CLR擴展的機制。 這種機制能夠表示大多數現代程式語言的語法,消除了每種語言自己唯一且不兼容的方法。CTS是一套CLR中的數據類型都必須遵守的規則。如果某種語言在創建數據類型時遵守了CTS,則它創建和存儲的數據將能夠與其他也遵守了CTS的程式語言兼容。
      (2)標準化應用程式格式。.NET 擁有自己的微軟中間語言(MSIL)、元數據和清單的彙編。所有的.NET語言的編譯器都生成這種格式。即通過從元數據中提取有關的MSIL的資訊,編譯器、調試器、協調器等工具都可以分析處理任何一種源程式設計的數據。

· CLS

  各種程式語言之間除了類型不同,其他方面也存在著極大的區別。例如有的語言不區分大小寫,有的不支援 unsigned(無符號)整數、操作符重載或者參數數量可變的方法。要創建很容易從其他程式語言中訪問的類型,只能從自己的語言中挑選其他所有語言都支援的功能。因此微軟定義了「公共語言規範」(Common Language Specifition,CLS)。

  CLS 詳細定義了一個最小功能集(CTS 的一個子集)。任何編譯器只有支援這個功能集,生成的類型才能兼容其他符合 CLS、面向 CLR 語言生成的組件。

· CLR

  公共語言運行時。 

  公共語言運行時是 .NET Framework 的基礎。 CLR 本質上就是.NET 虛擬機。  可將運行時看作一個在執行時管理程式碼的代理,它提供記憶體管理、執行緒管理和遠程處理等核心服務,並且還強制實施嚴格的類型安全以及可提高安全性和可靠性的其他形式的程式碼準確性。 事實上,程式碼管理的概念是運行時的基本原則。 以運行時為目標的程式碼稱為託管程式碼,而不以運行時為目標的程式碼稱為非託管程式碼。 

  公共語言運行時管理記憶體、執行緒執行、程式碼執行、程式碼安全驗證、異常處理、編譯、垃圾回收以及其他系統服務。 這些功能是在公共語言運行時上運行的託管程式碼所固有的。

  至於安全性,取決於包括託管組件的來源(如 Internet、企業網路或本地電腦)在內的一些因素,託管組件被賦予不同程度的信任。 這意味著即使用在同一活動應用中,託管組件既可能能夠執行文件訪問操作、註冊表訪問操作或其他須小心使用的功能,也可能不能夠執行這些功能。

  運行時還通過實現稱為常規類型系統 (CTS) 的嚴格類型驗證和程式碼驗證基礎結構來加強程式碼可靠性。 CTS 確保所有託管程式碼都是可以自我描述的。 各種 Microsoft 編譯器和第三方語言編譯器都可生成符合 CTS 的託管程式碼。 這意味著託管程式碼可在嚴格實施類型保真和類型安全的同時使用其他託管類型和實例。

  此外,運行時的託管環境還消除了許多常見的軟體問題。 例如,運行時自動處理對象布局並管理對對象的引用,在不再使用它們時將它們釋放。 這種自動記憶體管理解決了兩個最常見的應用錯誤:記憶體泄漏和無效記憶體引用。

  運行時還提高了開發人員的工作效率。例如,程式設計師用他們選擇的開發語言編寫應用,卻仍能充分利用其他開發人員用其他語言編寫的運行時、類庫和組件。 任何選擇以運行時為目標的編譯器供應商都可以這樣做。 以 .NET Framework 為目標的語言編譯器使得用該語言編寫的現有程式碼可以使用 .NET Framework 的功能,這大大減輕了現有應用的遷移過程的工作負擔。

  儘管運行時是為未來的軟體設計的,但是它也支援現在和以前的軟體。 託管和非託管程式碼之間的互操作性使開發人員能夠繼續使用所需的 COM 組件和 DLL。

  運行時旨在增強性能。 儘管公共語言運行時提供許多標準運行時服務,但是它從不解釋託管程式碼。 一種稱為實時 (JIT) 編譯的功能使所有託管程式碼能夠以它在其上執行的系統的本機語言運行。 同時,記憶體管理器排除了出現零碎記憶體的可能性,並增大了記憶體引用區域以進一步提高性能。

  最後,運行時可由高性能的伺服器端應用(如 Microsoft SQL Server 和 Internet Information Services (IIS))承載。 此基礎結構使您在享受支援運行時承載的行業最佳企業伺服器的優越性能的同時,能夠使用託管程式碼編寫業務邏輯。

· BCL

  基類庫。它是 FCL 的一個子集,它們為開發者提供了面向對象的特性所需的、和 CLR 緊密集成的一組可重用類的集合,並且此類庫僅使用 CTS 數據類型和標準的應用程式格式編製,從而簡化了應用開發過程和難度,而且很容易與第三方組件無縫集成,也能被使用任何一種 .NET 程式語言的應用程式所使用。CLI規範的一部分,定義了集合、執行緒處理、控制台以及用於生產幾乎所有程式所需的其他基類。

  它是一組構成 System.*(在一定的程度上構成 Microsoft.*)命名空間的庫。 BCL 是用於生成 ASP.NET、ASP.NET Core 等較高級應用程式框架的較低級通用框架。
  .NET 5(和 .NET Core)及更高版本的 BCL 的源程式碼包含在 .NET 運行時存儲庫中。 這些 BCL API 中的大多數也可以在 .NET Framework 中獲取,因此可將此源程式碼視為 .NET Framework BCL 源程式碼的一個分支。
以下術語通常指 BCL 引用的相同 API 集合:

· 基本操作

  構建於BCL之上,它是FCL的一部分,是FCL為開發人員提供的基礎性操作(如:資料庫操作、IO等)。

   面向數據:ADO.NET、Entity Framework、Linq To SQL等。

   面向服務:WCF、WF和 Data Services等。

· 框架模板

   面嚮應用:開發框架 (BS/CS)、IT產品

· 語言

  .NET Framework的核心是CLR。在CLR的控制下運行的程式碼稱為託管程式碼,在CLR執行程式碼之前,需要編譯,分為2個階段:
       (1)把源程式碼編譯為Microsoft中間語言(MSIL)。
       (2)CLR把MSIL編譯為平台專用的機器程式碼。
.NET平台支援很多語言,常見的有 VB、C++、C#、F#、J#(Java)JScript等。無論使用哪種語言來編寫源程式碼,都會通過編譯器編譯成MISL,從而轉換成機器碼,都能被機器識別。語言的集成性主要是公共語言規範(CLS)和通用類型系統(CTS)一起確保了語言的相互操作性。CLS是一個最低標準集,所有面向.NET的編譯器都必須支援它,每個語言都符合這個規範,從而滿足了語言的互相調用和互操作。

.NET Framework 下載與安裝

  • 安裝

          同一台電腦上可以同時安裝多個版本的 .NET Framework 版本。

          同一個版本的 .NET Framework 支援的Windows 版本不同。

  支援的 Windows 版本

  不受支援的 Windows 版本

 技術棧

 1、.NET:C#、.NET5、.NET6、.NET Core、MVC、ASP.NET Core、Web API、RESTful API

 2、jQuery、Vue.js、Bootstrap

 3、資料庫:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、SequoiaDB 、

                     Redis、MongoDB、ElasticSearch、TiDB

 4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分庫分表

 5、架構:領域驅動設計 DDD、ABP

 6、環境:跨平台、Linux、Windows、MaxOS、IIS、Nginx

 7、移動App:Android、IOS、HarmonyOS、微信、小程式、快應用、

                        Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、

                        mpvue、Smobiler

   

  其他:

  •  雲原生、CI/CD、DevOps、微服務、Docker、K8S
  •  Dapr、RabbitMQ、Kafka、分散式、大數據、高並發、負載均衡、中間件
  •  RPC、ELK
  • .NET + Docker + jenkins + Github + Harbor + K8S
  •  Python、Go