.NET平台.NET Framework的架构组成和跨平台原理

1,595 阅读9分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

.NET —— 免费开源的开发平台

.NET是一个免费、跨平台、开源的开发者平台,可以构建多种不同类型的应用。使用的是对开发者最为友好的MIT开源协议。

首先,.NET是一个软件开发平台,开发人员可以用来开发、构建不同的应用,所以,.NET包含对应的开发者包(Developer Pack)或软件开发工具(SDK)。

其次,基于.NET开发的应用需要在.NET提供的环境下运行,也就是对应的运行时(Runtime)环境。.NET SDK包含运行时环境,通常提供版本线下兼容的应用生成目标。

再次,Visual Studio 或 Visual Studio Code 作为编写代码的集成开发环境或代码编辑器,可以提供对SDK不同程度的使用支持(比如API、程序集的引用,软件包的管理等)、代码书写友好的环境或界面(比如代码高亮、智能提示、快速编写等)、软件开发流程的支持(比如软件测试、与其他工作流程的集成等)等,总之,以更好的帮助我们编写应用程序为目标。VS等的IDE会集成开发所需的SDK。

提到.NET框架,通常会被认为是.NET Framework,从.NET5版本开始,.NET基本开始作为全平台统一的开发运行框架开始发展(.NET Core更名为.NET,最新的.NET Framework 4.8作为 .NET Frameork 的最后一个版本,会得到安全性和可靠性的持续维护),基于 .NET平台 可以直接开发运行于不同系统的应用程序、App、云应用、Web网站等。

.NET Framework

微软于2002年2月13日正式推出第一代.NET平台 .NET Framewrok 1.0,.NET Framework 主要提供了面向 Windows 桌面(WinForm、WPF【.NET Framework 3.0时推出】)、服务器(ASP.NET Web FormsASP.NETWindows服务等)、本地和网络访问等功能的基础开发框架。

.NET框架的架构组成

.NET主要有两部分组成:公共语言运行时(Common Language Runtime-CLR)和框架类库(Framework Class Library-FCL),基础类库(Base Class Library-BLC)是框架类库的子集,也是框架类库的基础,框架类库提供了软件开发的模板和基础能力。

.NET 框架中,运行于底层的是公共语言运行时(CLR),它是公共语言基础设施(Common Language Infrastructure-CLI)的一个实现,它提供了.NET程序的运行环境,使得.NET应用程序可以执行,并直接与操作系统交互(调用系统API)。

CLI(公共语言基础设施)是一个规范,类似于产品经理撰写的产品说明书。一共包括四个部分:CTS、IL、底层文件、元数据格式。

在微软开始 .NET 框架的搭建时,曾向 ECMA 标准化组织提交了 CLI 的全部内容(www.ecma-international.org/publication…

而,CLR则是对CLI的一个实现(implementation),类似于开发者遵循产品说明书所开发出来的产品。

除了CLR之外,CLI的其他实现还有Mono、Core CLR、Mono、Rotor等。

在 CLR 之上,.NET 框架提供了全面、丰富的框架类库 (FCL),这些类库可以通过 CLR 调用操作系统的 API,从而实现各种功能。

框架类库(FCL)为开发者编写.NET平台的各种各样的应用程序,提供了最基础的能力和最便捷的方式。

在类库之上,基于CTS实现的各种语言,如C#、VB.NET、F#等,可以访问框架类库,为实现一定的功能编写相关的代码。

公共语言规范(Common Language Specification-CLS)作为 .NET语言 应该必须实现的最小功能集(CTS 的一个子集),用于实现各个不同 .NET语言 之间的相互调用或程序集的相互使用。如果基于CTS创建的新语言不满足CLS的要求,则该新语言就无法被其他.NET语言(的程序集)使用。

对于CLR在运行时管理程序的执行,还会涉及以下部分的内容:

  • 内存管理和垃圾回收
  • 代码安全验证
  • 代码执行、线程管理及异常处理

所有遵从CTS的语言,都可以看作是.NET语言,而如果该语言还满足CLS,则可以直接与其他的.NET语言(如C#、VB.NET)相互使用。

CTS更标准的名称应该是“公共类型规范”-Common Type Specification(来自官方文档)。

目前所能查到的资料基本都称之为“公共类型系统”,不过不影响其本质含义和作用。虽然感觉“公共类型规范”的名称更贴切。

代码的执行原理

任何编程语言想要被计算机理解,都需要转换为机器码才能执行。因此,在转换为机器码执行的方式上,主要产生了两种:编译和解释

  • 编译执行:通俗来说就是,将编程语言写的代码转换为机器码,然后在用到的时候直接执行编译后的机器码;
  • 解释执行:一边转换为机器码一边执行。也就是每次执行时都要读取源代码,然后一行行的执行。

编译(compile)是将一种语言转换为另一种语言的动作。通常另一种语言是机器码(machine code,也称为本地代码native code),即计算机中存储执行的0和1组成的(二进制)代码,编译后生成的文件也叫目标文件。编译的目标语言也可以是某种公共语言或中间语言(Intermediate Language-IL)

像C#等.NET系语言,会先将其转换为公共中间语言(Common Intermediate Language-CLI,也称为MSIL微软中间语言),比如将C#语言的程序文件,会先将其编译为中间语言IL的exe或dll文件,然后才能运行或被其他程序调用。

IL、MSIL 和 CIL 指的是同一种东西,CIL使用较多。

IL是一个基于栈的、面向对象的高级语言。

解释(interpret)会读取一行代码然后转换为机器码并执行,然后在执行后面的代码,并不会产生目标文件。每次运行解释型语言,都要重新解释(从源代码转换为机器码)一遍。也因此,通常情况下,解释型语言执行速度较慢,常用作脚本语言使用。

.NET代码的两步编译和运行(跨平台实现)

.NET的代码会先编译为中间代码,与C、C++等直接编译为机器码的编译型语言有所不同。

.NET语言会通过两步编译转换为机器码(也可以说是 一步编译 + 一步解释):

  • 第一步:使用.NET自带的编译器生成生成IL中间语言。IL语言无法被机器直接执行。【java类似,它的中间层叫做字节码(bytecode)】
  • 第二步:在运行时(runtime),CLR使用JITjust-in-time,即时编译)将IL转换为机器码并执行。

csc.exe.NET Framework 中自带的将C#代码编译为IL中间代码的编译器。

CLR是.NET程序执行的基础,是.NET中最重要的组件,没有之一。

IL或字节码转换为机器码时,会使用对应机器的解释器来执行,以做到在不同的机器平台上运行。此时的解释器执行时,采用的是即时编译的形式(一句句编译中间代码,但是会将翻译后的机器代码缓存起来,以减少性能损耗)。也因此,它的性能比普通的没有缓存功能的解释型语言要快。

但是,执行完毕,程序退出后,缓存的代码会被回收。每次运行时都需要重新即时编译和缓存。

同样的,(初次)启动编译中间代码程序时,会比较慢,运行中则使用的是机器码。

跨平台的口号:“一次编译,到处运行”,其中的"一次编译"指的就是第一步编译,转化为中间语言;“到处运行”则是通过JIT即时编译,在任何机器上执行。

跨平台的实现依靠的是中间层代码来解决的。

【不同操作系统和处理器的机器码(本地代码)是不同的】

附:.NET Framewrok不同版本的发布时间线

从2002年 .NET Framewrok 1.0 开始,后面逐渐推出了功能和性能更加完备的增强版本。

  • .NET Framewrok 1.0:2002年2月,CLR 1.0、C# 1.0、VS2002(上一个版本叫Visual Studio 6)
  • .NET Framewrok 1.1:2003年4月,CLR 1.1、C# 1.2、VS2003
  • .NET Framewrok 2.0:2005年11月,CLR 2.0、C# 2.0、VS2005。C# 2。0 推出了泛型。
  • .NET Framewrok 3.0:2006年11月,CLR 2.0、C# 3.0(不含linq)、VS2005。推出了WCF(统一Web服务通信)、WPF(现代UI框架)、WF(工作流)等。
  • .NET Framewrok 3.5:2007年11月,CLR 2.0、C# 3.0、VS2008。C# 3推出了最重要linq功能,以及扩展方法、lambda表达式等。
  • .NET Framewrok 3.5 SP1:新增ADO.NET Entity Framework
  • .NET Framewrok 4.0:2010年4月,CLR 4、C# 4.0、VS2010。主要增加了动态语言运行时(DLR)和任务并行库(TPL,包括PLINQ、Task等)。
  • .NET Framewrok 4.5:2012年8月,CLR 4、C# 5.0、VS2012。C# 5推出了async/await异步操作方式。
  • .NET Framewrok 4.5.1:2013年10月,CLR 4、C# 5.0、VS2013
  • .NET Framewrok 4.5.2:2014年5月,CLR 4、C# 5.0、VS2013
  • .NET Framewrok 4.6:2015年7月,CLR 4、C# 6.0、VS2015
  • .NET Framewrok 4.6.1:2015年11月,CLR 4、C# 6.0、VS2015
  • .NET Framewrok 4.6.2:2016年8月,CLR 4、C# 7.0、VS2017
  • .NET Framewrok 4.7:2017年4月,CLR 4、C# 7.1、VS2017
  • .NET Framewrok 4.7.1:2017年10月,CLR 4、C# 7.2、VS2017
  • .NET Framewrok 4.7.2:2018年4月,CLR 4、C# 7.3、VS2017
  • .NET Framewrok 4.8:2019年4月,CLR 4、C# 8.0、VS2019

推荐或参考