开启掘金成长之旅!这是我参与「掘金日新计划 · 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 Forms
、ASP.NET
、Windows服务
等)、本地和网络访问等功能的基础开发框架。
.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使用JIT
(just-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
推荐或参考
- 关于 .NET Framework 的发展历程和版本介绍,可以参考 .NET平台系列1 .NET Framework 发展历程
- 《C#从现象到本质》