.NET Framework基本上可以分为两大层次:
CLR的作用是为程序的执行提供了一个托管的执行环境,他是.NET Framework的执行引擎,为托管程序的执行提供了内存分配、垃圾回收、安全控制、异常处理和多线程管理方面的服务。
CLR是.NET Framework的一个子集,但是两者缺对立了不同的版本。微软截至目前发布了4个版本的CLR:1.0、1.1、2.0、4.0;.NET Framework的1.0和1.1采用的是CLR的1.0和1.1,.NET Framework的2.0和3.x使用的CLR 2.0,.NET Framework 4.x均使用的CLR 4.0。
FCL是一个为开发人员提供API的类库,它提供的API类库可以分为两个层次:
我们可以将FCL的面向应用或者服务类型(比如Windows Forms、WPF、ASP.NET和WCF等)的部分分成AppModel,那么.NET Framework的整体架构可以如下图所示:
.NET是通过Mono和Xamarin将其伸展到其他的平台(Linux、Mac、Andriod等)
.NET 跨平台其实建立在一个开放的标准或者规范当中,而这个规范就叫做CLI(Common Language Infrastucture)。CLI其实解决的就是:由不同的编程语言开发的.NET应用能够无需任何更改就能运行在不同的系统环境之中。解决这个问题就涉及到了【编程语言的差异】和【运行时环境差异】,编程语言能够相互兼容,运行时环境能够得到统一,跨平台就能得到实现。
CLI(Common Language Infrastucture)分为【Common Language】和 【Infrastucture】
Common Language其实是一种通用语言,为的就是解决编程语言的兼容性问题。
Infrastucture其实是动态执行应用的引擎。
所以CLI就为可执行代码和引擎提供了一个标准。
编程语言有解释型和编译型之分。编译型则需要编译器生成可执行代码,Common Language其实是编译型语言。想要真正实现跨平台,最终目的就是解决可执行代码在不同平台的兼容性与可移植性,但是应用的兼容性和可移植性是编译后结果决定的。如果能将不同的编程语言通过编译器编译成符合标准代码,那么就能解决编程语言之间的差异。
按照CLI标准的规定,可执行代码称为CIL(Common Intermediate Language)的语言,是一种介于编程语言和机器语言之间的中间语言,也是一门OOP语言。
不同编程语言可以通过编译器得到统一,而运行环境则可以通过虚拟机技术解决。虚拟机是CIL的运行容器,它能够在CIL执行的时候动态的将他翻译成与当前环境完全匹配的机器指令。而CIL就是一种虚拟机语言。
由此可见 .NET建立在CLI这一标准之上,所以天生就具备了“跨平台”的基因。
要真正实现.NET 的跨平台,主要需要解决两个问题:
对于真正跨平台的.NET Core来说,微软不仅为它设计了针对不同平台被成为CoreCLR的运行时,同时还重新设计了一套被称为CoreFX的BCL
NET Core目前支持的AppModel支持有两种,一是.NET Core用于开发服务器Web应用和服务;二是UWP(Universal Windows Platform)用于开发能够在各种客户端设备上自适应的Windows 10应用。
这些模块对应这一个单一的程序集,并最终由对应的NuGet包来分发。至于底层的虚拟机,微软则为主流的操作系统和处理架构设计了针对性的运行时就是 CoreCLR
CoreFX是经过完全重写的BCL,除了自身就具有跨平台执行的能力之外,其提供的API也不再是统一定义在少数几个单一的程序集中,而是经过有效分组之后被定义在各自独立的模块中
作为运行时的CoreCLR和提供BCL的CoreFX是.NET Core两根重要的基石。.NET 能够成长为跨平台的.NET Core 他们是主力军,CoreCLR运行时为.NET Core应用提供了不同平台不同的执行环境;CoreFX为.NET Core提供了彻底解决代码复用的难题。