.NET的分层与概念

cover
最近有项目需要在windows下做开发,用到了.NET。作为一个小白,先从整体分层架构理清一些基本概念

根据自己的理解,画了下面这张图。虽然是全新接触,但是只需要学习c#的语法,以及.NET Framework的API,基本就可以上手了,其他东西跟java node.js等大致上相通

layer

可以看到.NET作为一个开发平台,可以跟JAVA,node.js作类比,都是一套完整的体系。把.NET再进一步打开,还有一些更细粒度的概念

.NET的范围

.NET是整体概念,是完整的开发平台,主要包括:

  1. 支持该平台的编程语言,典型的如c#。类似的,JAVA平台和java语言也不同,用大小写加以区分,JAVA平台对应.NET,java语言对应c#
  2. 支撑平台的开发框架,包括.NET Framework、.NET Core、Mono等
    • 定义了通用类型系统CTS,Common Type System
    • 运行时环境CLR,Common Language Runtime
    • 框架库FCL
  3. 各种开发工具,如vscode,rider

所以,.NET指的是技术体系。而.NET Framework是其中的一个子集,是在windows操作系统上的实现。.NET Core是.NET体系在其他OS上的实现,而MONO则是跨平台的

BCL与FCL

比如helloworld里用到的Console类,System.IO中的File类,这些类包含最基本的功能,称之为BCL(Base Class Library),大多都包含在System命名空间下

由微软开发的类库统称为FCL(Framework Class Library),上述BCL就是FCL的一个子集,FCL中大部分类都是通过C#来编写的。FCL除了BCL之外,还包含ASP.NET类库,用于桌面开发的WPF类库,用于通信交互的WCF类库等

.NET的跨语言与跨平台能力

当设计面向.NET平台的编程语言时,需要遵循CTS(Common Type System)体系,它包括:

  1. 建立用于跨语言执行的框架
  2. 提供面向对象的模型
  3. 定义处理类型时,所有语言都必须遵守的规则(CLS)
  4. 提供包含应用程序开发中使用的基本数据类型(如 Boolean、Byte、Char 等)的库

微软已经将CTS提交给ECMA负责维护,最终发布的公开标准,称为CLI(Common Language Infrastructure)。CTS和CLI可以认为是同义词,即CLI是基于微软提交的CTS,ECMA负责维护的工业标准。

支持.NET的编程语言有很多,比如c#和vb.net,这些语言可以互操作。比如用vb开发的方法,编译为dll之后,可以在c#中直接调用。这种跨语言的能力,是通过上述CLS(Common Language Specification)来支持的

CLS是CTS的子集,从类型、命名、事件、属性等方面对语言进行了共性的定义及规范。这意味着一种语言特征可能符合CTS,但超出了CLS的范围。例如:c#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅支持符号数字类型。因此,如果开发者在组件中用到了c#的无符号类型,就可能无法与不使用无符号类型的语言(如VB.NET)开发的.NET组件互操作。

CLR是CTS的具体实现,CLR是应用程序的执行引擎,以及对应的类库,该类库严格按照CTS规范实现。作为runtime,CLR负责载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。在CLR监控之下运行的代码,称为托管代码(managed code)。作为类比,CTS类似JVM规范,而CLR类似JVM

所有.NET语言编译器生成的平台无关代码,称为通用中间语言(CIL,简称IL)。类似于JAVA的字节码

整体关系如下图

CTS

通常来说,作为开发应用程序的程序员,主要需要掌握CLR,即运行时的各种特性,以及相关的API,而不是CTS和CLS。而对于以.NET平台为目标的语言和工具开发商,就需要深入理解CTS和CLS。