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

張傳寧發表於2021-04-25
什麼是 .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

相關文章