.NET 应用程序如何编译和运行?
为了确切地了解DotNet应用程序的编译和运行,请查看下图。
首先,开发人员必须使用任何支持DotNet的编程语言(如 C#、VB、J#等)编写代码。然后,相应的语言编译器将程序编译为称为中间语言 (IL) 代码。
例如,如果编程语言是 C#,则编译器为 csc,如果编程语言是 VB,则编译器将是 vbc。此中间语言 (IL) 代码是半编译的代码,即部分编译的代码,不能由操作系统直接执行。
因此,当您想要在计算机上执行此 IL 代码时,DotNet框架提供一些称为CLR或公共语言运行时的东西,它负责执行IL代码。
CLR采用IL(中级语言)代码,并赋予名为JIT编译器。JIT 编译器采用IL代码并读取IL代码的每一行,并将其转换为计算机特定的指令(即二进制格式),这些指令可由基础操作系统执行。
中级语言(IL)代码
IL 代码是半编译或部分编译或独立于 CPU 的部分编译代码。
为什么部分编译代码或为什么不完全编译代码?
作为开发人员,您可能会思考为什么部分编译的代码,或者为什么没有完全编译的代码。原因很简单。我们不知道在什么样的环境中运行 .NET 代码将运行 (例如, Windows XP, Windows 7, Windows 10, Windows 服务器等)。
换句话说,我们不知道什么操作系统将运行我们的应用程序;我们亦不知道CPU配置、机器配置、安全配置等。因此,IL 代码是部分编译的,在运行时,此 IL 代码会编译为使用环境属性(如操作系统、CPU、计算机配置等)的特定于计算机的说明。
通用语言运行时
CLR 是 .NET Framework 的核心,它包含以下组件。
1.安全管理器
2.JIT 编译器
3.内存管理器
4.垃圾收集器
5.异常管理器
6.通用语言规范 (CLS)Common Language System
7.通用类型系统 (CTS)Common Type System
接下来详细讨论每个组件的哪些功能。
安全管理器
基本上有两个组件来管理安全性。它们如下所示:
1.CAS(代码访问安全性)
2.CV(代码验证)
这两个组件基本上用于检查当前用户的权限,即允许用户访问程序集。CLR 还了解此代码具有哪些权利或权限,以及操作系统是否安全。因此,基本上这些类型的检查由安全管理器维护。
JIT 编译器
JIT 编译器负责将 MSIL 代码转换为由计算机执行的本机代码。本机代码是系统硬件直接可以理解的。JIT 在执行前编译代码,然后将此转换保存在内存中。
内存管理器
内存管理器组件为应用程序要使用的变量和对象分配必要的内存。
垃圾收集器
当DotNet应用程序运行时,将创建大量对象。在给定的时间点,我们可能不需要这些对象。因此,垃圾回收器只不过是一个小例程,或者你可以说它是一个后台进程线程,它运行并尝试识别应用程序当前未使用的对象,并取消分配这些对象的内存。
异常管理器
每当在运行时发生异常时,此组件都会重定向处理器以执行 catch 或最终阻止。
通用类型系统(CTS)
.NET 框架支持许多编程语言,如 C#、VB.NET、J# 等。每个编程语言都有自己的数据类型。一种编程语言无法理解其他编程语言数据类型。但是,在某些情况下,您希望用一种语言编写代码,以其他语言调用。为了确保这些语言之间的顺畅通信,最重要的是它们应该有一个通用类型系统 (CTS),以确保用两种不同语言定义的类型编译为公共数据类型。
CLR 将执行所有编程语言的数据类型;这是可能的,因为CLR将包含它自己的数据类型,这是所有编程语言通用的。
在编译时,所有特定于语言的数据类型都转换为 CLR 的数据类型。此数据类型 CLR 是 .NET 的所有编程语言通用的,称为通用类型系统 (CTS)。
CLS(通用语言规范)
CLS 是 CLR 的一部分。.NET 支持许多编程语言,并且每个编程语言都有自己的语法规则来编写代码,称为语言规范,即每个编程语言都有自己的语言规范。
一种编程语言无法理解其他编程语言语法规则(语言规范)。但 CLR 将执行所有编程语言代码。这是可能的,因为CLR无法理解任何编程语言规范,而CLR有其MSIL自己的语言规范(语法规则)。
每个语言编译器在编译时都应遵循 CLR 的此语言规范,并生成 MSIL;CLR 的 JIT 编译器将从 MSIL 生成本机代码。此 CLR 的语言规范对于 .NET 的所有编程语言代码执行都很常见,称为 CLS。