为了更好地学习.NET框架,本文简单梳理了.NET体系相关内容。文中若有不准确的地方,欢迎大家指出交流。
.NET简介
微软于90年代开始研究称为.NET战略的技术。20年代初,.NET框架被称为下一代Windows服务。2000年后期微软发布了.NET框架的第一个beta版本,然后于2002年2月13日发布了第一个正式版本(.NET 1.0),之后又陆续发布了许多具有新功能的版本,关键节点如下图:
.NET是微软创建的开源开发平台,使用 MIT and Apache 2 协议,属于.NET基金会。
.NET支持多种开发语言,可以使用C#、VB.NET、C++/CLI、F#等语言进行开发,不同语言的开发者可以互相配合。
使用.NET可以开发不同类型的应用,如桌面应用、移动应用、游戏、Web应用。
使用.NET Core、.NET5及以上版本可以开发跨平台的应用程序。.NET支持不同的操作系统,如Windows、Linux、Android、iOS,支持不同架构的处理器(x86、x64、ARM32、ARM64)。
可以使用Visual Studio(Windows)、Visual Studio for Mac(macOS)、Visual Studio Code(Windows/macOS/Linux)进行开发,可以通过NuGet包管理器安装第三方依赖。
如果想了解一些基于.NET实现的解决方案,如Roslyn、dnSpy、log4net、Prism、Caliburn Micro等,可以参考此链接。
.NET体系
起初,微软创建了.NET Framework,它是基于Windows的。Mono创建于2001年,它提供了.NET的另一种实现,具备跨平台的能力。为了创建跨平台的解决方案,微软推出了.NET Core。2020年末,微软发布了.NET 5,可以看到已经去掉了Framework及Core的后缀,此后的版本也不会再区分Framework及Core。发展到现在,.NET体系包含了上述不同的框架及其运行时。
所有运行时使用.NET提供的基础工具进行编译和运行代码,包括.NET支持的开发语言(C#、VB等)、编译器(Roslyn)、垃圾回收期(GC),以及构建工具(MsBuild)、CLR。比如,开发一款Windows客户端应用程序,可以使用C#或者VB语言编写逻辑代码,使用.NET Framework的WPF框架或WinForm框架进行界面开发。使用Visual Studio进行开发时,会调用MsBuild构建程序,它会调用Roslyn将代码编译为IL保存在程序集中(exe/dll)。在运行时,CLR中的JIT编译器会将IL编译为本机操作系统理解的代码执行,GC则负责垃圾回收。.NET的体系结构如图所示:
VB C# F#
可以使用VB、C#或F#等语言编写.NET应用程序。
VB是微软开发的传统面向对象编程语言,VB6.0后,引入了.NET Framework。VB深受比尔盖茨的喜爱,它是最接近人类语言的计算机编程语言。
主导C#开发的是Pascal之父、Delphi首席架构师Anders Hejlsberg。C#取义C++的++,即(C++)++,合在一起就是个#,所以读作C sharp。C#的设计思想主要借鉴了C++,Java以及Pascal,是一种面向对象的编程语言,也是目前最流行的开发语言之一。
F#是2005年微软研究院发布的一种函数式编程语言,是一种开源、跨平台、可互操作的编程语言,用于编写简洁、可靠且性能高的代码。
.NET Framework .NET Core .NET 5
.NET Framework是用来开发运行在Windows系统下的应用的,使用了很多Windows API,目前最新版本为4.8,源码已开源。它由CLR、类库、及应用工作负载(WPF、WinForm、ASP.NET)组成。如果需要运行.NET Framework构建的应用,需要先安装相应版本的框架。同一台机器可以安装不同版本的.NET Framework。
.NET Core是开源的,2016年发布了.Net Core 1.0版本。它是为了提供跨平台的应用开发能力,并非是.NET Framework的替代品。.NET Core加入了UWP(Windows通用应用平台)框架,可以开发运行在PC、Windows Phone、Surface等所有Win 10平台的应用。不同于.NET Framework,.NET Core由CoreCLR、.NET Core类库、ASP.NET Core等组成,后续的版本也加入了WinForm、WPF等框架。.NET Core可以在不同平台上运行,它可以创建独立应用,无需在主机中安装.NET Core,但部署会比较大。
.NET 5是2020年发布的,计划2021年11月发布.NET 6。.NET 5是.NET Core 3.1的下一个版本,由于最新的.NET Framework版本为4.8,为了避免开发者困惑,跳过了4,这也表明了.NET 5是.NET平台的未来,它将统一.NET。在.NET Core开始时,就已经向项目中添加了大约五万个.NET Framework API,.NET Core 3.0进一步缩小差距,添加了WinForm、WPF、EF,.NET 5在此基础上,又集成了Mono的优点。.NET 6中将正式集成MAUI,MAUI是Xamarin.Forms的进化,使用MAUI进行开发,将可以发布到Android、iOS、Windows、macOS平台。另外,.NET 5也提供了对ARM64的支持。
.NET Standard不是某一个具体的实现,而是一组标准、规范,它定义了一组API。
一些名词
首先解释下各个名词的意思:
JIT(Just in time):JIT编译器将IL转换为处理器理解的机器代码,JIT边运行边编译,编译发生在应用程序执行期间,因此编译时间是运行时间的一部分。JIT编译在需要运行代码的同一台计算机上按需执行。
AOT(Ahead of time):运行前编译。AOT编译在应用程序执行前进行并且通常在不同计算机上执行。AOT 工具不会在运行时进行编译,因此它们不需要最大程度地减少编译所花费的时间,这意味着它们可花更多的时间进行优化。
IL(Intermediate language):高级.NET语言(例如C#)编译为与硬件无关的指令集,称为中间语言(IL)。IL 有时也被称为MSIL(Microsoft IL)或CIL(Common IL)。
CLR(Common Language Runtime):即公共语言运行时,它负责处理内存分配及管理。CLR也是一个虚拟机,可以使用JIT编译生成代码,执行应用程序。
BCL(Base class library):基类库,一组包含 System.*
(以及有限范围的 Microsoft.*
)命名空间的库。BCL 是一种通用的低级框架,高级应用程序框架(如ASP.NET Core)在其上构建。
CTS(Common type system):即通用类型系统。CTS定义了CLR如何声明、使用和管理类型,也是CLR支持跨语言集成的重要组成部分。CTS建立了有助于实现跨语言集成、类型安全和高性能代码执行的框架,提供了面向对象的模型,支持多种编程语言的完整实现,定义了语言必须遵循的规则,提供了包含应用程序开发中使用的基本数据类型(例如Boolean、Byte、Char、Int32和UInt64)的库。
CLS(Common Language Specification):即公共语言规范。为了实现完整的互操作性场景,在代码中创建的所有对象都必须依赖于所用语言中的一些共性,.NET在CLS中指定了这些共性。CLS是 CTS的一个子集。如果一个组件仅在其API中公开CLS功能,则称为符合CLS,则可以与.NET上支持的所有语言交互。
.NET发布计划
下个月(2021.11),微软将发布正式版的.NET 6、C# 10及VS2022。.NET 6将进一步实现微软.NET平台的统一愿景,为.NET开发者提供了更好的平台。.NET发布计划如下图: