.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(通用语言运行时)。