一、起步
CLI(common language infrastructure)
通用语言基础架构是微软联合惠普等巨头与2000年向ECMA提交的技术规范,该规范是开放的。个它规定了如何在运行库中声明、使用、管理类型,同时也是运行库支持跨语言互操作的一个重要组成部分。
CLI要达到的目的:
- 建立一个支持跨语言集成,类型安全和高性能代码执行的框架
- 提供一个支持完整实现多种编程语言的面向对象的模型。
- 定义各种语言必须遵守的规则,有助于确保用不能语言编写的对象能够交互作用。
CTS(common type system)
对于各种强类型编程语言,定义变量时必须指定变量类型。每一种编程语言所包含的变量类型不尽相同,即使是同一个数据类型。表达方式也各不相同。.Net在设计中博采众长,借鉴了各种主流编程语言的长处,对各种不同的编程语言的数据类型进行了抽象就有了CTS。
CLS(Common language specification)
CTS中定义了大量的类型,这些类型是CLR都能识别的类型。但是并没有要求每种语言都要完全实现。因此在CTS这个大的集合中,截取了其中一部分,要求各种语言都支持,否则无法实现互操作。这一小部分称作“公共语言规范”
CLR(Common language runtime)
主要负责管理 .Net应用程序的编译,运行,为应用程序提供内存分配,线程管理,安全以及垃圾回收等服务,以及负责对代码实施严格的类型安全检查,以保证代码安全、正确地运行。
一图胜千言:
小结一下:
- CLI是一个规范,CRL是其中的一个实现,另外还有其他的实现比如Mono,Protable.Net
- CTS是为了让所有实现该规范的编程语言能在.Net平台上运行
- CLS是CTS的一个子集,该规范定义的功能能在所有语言上实现互操作。
二、野蛮生长
.net框架=CLR+BCL+FCL
自从2002年推出.net framework1.0以来,微软乐此不疲的在这个框架上舔砖加瓦,使得这个框架越来越强大,同时也变得越来越臃肿。
对于桌面平台之外的应用场景,微软对这个框架进行不同程度的裁剪,参看老A的介绍:
多个设备平台独自为政
经过多年的经营,微软已经为我们构建了一个完整的支持多种设备的.NET生态系统,从最初单纯的桌面平台,逐渐扩展到移动、平板和嵌入式等平台。设备运行环境的差异性导致了针对它们的应用不能构建在一个统一的.NET Framework平台上,所以微软采用独立的.NET Framework平台来对它们提供针对性的支持。就目前来说,除了支持Windows 桌面和服务器设备的“完整版 .NET Framework”之外,微软还先后推出了一系列“压缩版.NET Framework”,这其中就包括Windows Phone、Windows Store、Silverlight和.NET Micro Framework等,它们分别对移动、平板和嵌入式设备提供支持。
这些.NET Framework并不是仅仅在AppModel层次提供针对相应设备平台的开发框架,它们提供的BCL和Runtime也是不同。换句话说,这些.NET Framework平台是完全独立的,不同.NET Framework平台之间的独立性很直观地体现在下图之中。目标平台的独立性导致我们很难编写能够在各个平台复用的代码,关于这一点我们会在下面一节“复用之伤”中做重点讨论。
三、跨平台时代
为了实现跨平台,微软重写了CLR也就是后来的CoreCLR,增加了针对其他平台的JIT编译器。BCL也从物理上进行了更小粒度的切分。支持Nuget单独下载。同时为了实现在不同目标平台上的代码复用推出了.NET Standard标准。
四、分久必合?
2020年将发布.Net5,这个框架很微软总喜欢搞大一统。希望不要重蹈覆辙。