.NET 程序執行流程
了解.NET 程序執行過程之前,讓我們先了解如何執行非DotNet應用程序。如:VB6 或C++程序。
非DotNet程序執行過程
我們知道計算機只了解計算機級代碼。計算機級代碼也稱為本機代碼或二進制代碼。
因此,當我們編譯 VB6 或 C++ 程序時,相應的語言編譯器將編譯相應的語言源代碼並生成本機代碼(也稱為二進制代碼),底層操作系統和系統硬件可以理解該代碼。下圖顯示了上述過程。

由相應語言編譯器生成的本機代碼或計算機代碼特定於生成該代碼的操作系統。
如果我們使用此編譯的本機代碼並嘗試在另一個操作系統上運行,則它將失敗。因此,這種程序執行方式的問題在於它無法從一個平台移植到另一個平台。
DotNet程序執行流程
現在讓我們了解 .NET 程序執行過程。使用 .NET,我們可以創建不同類型的應用程序,如控制台、Windows、Web 和移動應用程序。無論我們執行任何 .NET 應用程序時的應用程序類型如何,以下情況都按順序發生
.NET 應用程序源代碼被編譯為 Microsoft 中間語言 (MSIL),也稱為中間語言 (IL) 或通用中間語言 (CIL)。.NET 和非 DOTNET 應用程序在編譯應用程序時生成程序集。通常,程序集具有 的擴展 .DLL 或 .EXE 基於我們編譯的應用程序類型。
例如,如果我們在 .NET 中編譯窗口或控制台應用程序,我們會獲得類型的程序集.EXE,而當我們在 .NET 中編譯 Web 或類庫項目時,我們得到一個類型的程序集.Dll。
.NET 和 NON-DOTNET 程序集的區別在於 DOTNET 程序集是中間語言格式,而非 .NET程序集是本機代碼格式。
NON.NET 應用程序可以直接在操作系統上運行,因為 NON-DOTNET 程序集包含本機代碼,
而 .NET應用程序在稱為通用語言運行時 (CLR)的虛擬環境的頂部運行。
CLR 包含一個名為"實時編譯器 (JIT)"的組件,該組件將中間語言轉換為本機代碼,基礎操作系統可以理解該代碼。
DotNet程序執行步驟
在 .NET 中,應用程序執行包含 2 個步驟
在步驟1中,相應的語言編譯器將源代碼編譯為中間語言(IL),在第二步中,CLR中的JIT編譯器將中間語言(IL)代碼轉換為本機代碼,然后可由底層操作系統執行本機代碼。 下圖顯示了上述過程。

由於 .NET 程序集采用中間語言 (IL) 格式,而不是本機代碼或計算機代碼格式,因此只要目標平台具有通用語言運行時 (CLR),.NET 程序集便可移植到任何平台。目標平台的 CLR 將中間語言代碼轉換為基礎操作系統可以理解的本機代碼或計算機代碼。
中間語言代碼也稱為托管代碼。這是因為 CLR 管理在它內部運行的代碼。例如,在 VB6 程序中,開發人員負責取消分配對象消耗的內存。如果程序員忘記去分配內存,則可能會發生內存異常。另一方面,.NET 程序員不必擔心取消分配對象消耗的內存。自動內存管理也稱為垃圾回收,由 CLR 提供。由於 CLR 正在管理和執行中間語言,因此它 (IL) 也稱為托管代碼。
.NET 支持不同的編程語言,如 C#、VB、J# 和C++。C# 、VB 和 J# 只能生成托管代碼 (IL),而 C++可以生成托管代碼 (IL) 和非托管代碼(本機代碼)。
關閉程序后,本機代碼不會永久存儲在任何地方,本機代碼將被扔掉。當我們再次執行程序時,將再次生成本機代碼。
.NET 程序類似於 java 程序執行。在 Java 中,我們有字節碼和 JVM(Java 虛擬機),而在 .NET 中,我們有中間語言和 CLR(通用語言運行時)。
