.NET Ftamework中几乎所有功能都是通过大量的托管类型提供的。这些类型组织在层次化的命名空间中,并打包为一套程序集,与CLR一起构成了.NET平台。
有些.NET类型是由CLR直接使用的,且对于托管宿主环境而言是必不可少的。这些类型位于一个名为mscorlib.dll的程序集中。包括C#内置类型、基本的集合类、流处理类型、序列化、反射、线程和原生互操作类型(“mscorlib"是“多语言标准通用对象运行行时库”,是Multi-language Standard Common Object Runtime Library的缩写”)。
在此之上是一些附加类型,它们充实了CLR层面的功能,提供了其他一些特性,如XML、网络和LINQ等。这些类型位于System.dll、System.Xml.dll和System.Core.dll中,并与mscorlib一起提供了丰富的编程环境供Framework的其他部分使用。
.NET Ftamework的其余部分是由一些实用API组成的。主要包含以下三个方面的功能:
1.用户界面技术
2.后台技术
3.分布式系统技术
表5-1 列出了各个版本的C#、CLR和.NET框架的兼容性历史。
C#、CLR和.NET Ftamework的版本
C#版本 | CLR 版本 | .NET Ftamework版本 |
---|---|---|
1.0 | 1.0 | 1.0 |
1.2 | 1.1 | 1.1 |
2.0 | 2.0 | 2.0、3.0 |
3.0 | 2.0 | 3.5 |
4.0 | 4.0 | 4.0 |
5.0 | 4.5 | 4.5 |
6.0 | 4.6 | 4.6 |
7.0 | 4.6 / 4.7 | 4.6 / 4.7 |
.NET Ftamework 4.6的新特性
1.在GC类中加入了新的方法,这些方法为垃圾回收器对何时(不)进行垃圾回收提供了更多的控制。并在GC.Collect方法中添加了更多的调整选项,
2.全新的速度更快的64位JIT编译器
3.System.Numerics命名框架选择提供了支持硬件加速的矩阵、向量、大整数(BigInteger)和复数(Complex)类型。
4.提供了新的System.AppContext类。提供了统一的机制方便程序库的作者开启/关闭新API的功能。
5.Task将在创建时保存当前线程的文化和用户界面的文化信息。
6.更多的集合类型实现了IreadOnlyCollection< T >接口。
7.WPF提供了更多的改进,包括更好的接触支持和高分辨率(DPI)支持。
8.ASP.NET在Window10下开始支持HTTP/2和令牌绑定协议(Token Binding Protocol)。
.NET Framework的程序集和命名空间是相互交错的。其中最极端的就是mscorlib.dll和System.Core.dll了。虽然它们各自定义了很多命名空间但是没有一个命名空间是以mscorlib或者System.Core为前缀的。然而,有一些例子并没有这么明显,因此更容易混淆,如System.Security.Cryprography命名空间下的大部分类型是在System.dll中定义的。
许多核心类型都定义在mscorlib.dll、System.dll和System,Core.dll程序集中。其中mscorlib.dll程序集包含了运行时本身需要的类型;System.dll和System.Core.dll包含了程序员需要的其他核心类型。后两个程序集单独分开是历史原因造成的:当Microsoft退出.NET Framwork3.5时采用增量的开发方式,以便能够让它作为一层运行在现有CLR2.0上。因此几乎所有新添加的核心类型都进入了一个新的程序集,Microsoft将其命名为System.Core.dll。
.NET Ftamework 4.7的新特性
.NET Ftamework 4.7 是一个主要作为维护性质,而非添加新功能版本。它修正了很多缺陷,并进行小幅的改进,包括:
1.将System.ValueTuple结构体纳入进了Framework 4.7体系。因此在C# 7 中不必引用System.ValueTuple.dll程序集就可以使用元组了。
2.改进了WPF的支持。
3.改进了Windows Forms对高分辨率显示器的支持。
5.1 .NET标准2.0
在第1章时介绍了三种替代.NET Framework的跨平台开发手段:
1.应用于window10设备/桌面的UWP
2.支持windows、Linux和MacOS的.NET Core/ASP.NET Core
3.用于移动设备开发的Xamarin(支持iOS、Android和Windows 10设备)。
可喜的是到.NET Core2.0时,这些框架(包含.NET Framework 4.6.1及之后的版本)将其核心功能进行了提炼,形成了一套拥有相似类型和成员的基础类型库。这些共同的部分形成了一套标准,称为NET标准2.0(.NET Standard 2.0)。
因此,若使用Visual Studio 2017开发程序库,则可以将目标框架设置为.NET标准2.0而不是选择特定的框架。这样,你的程序库就具备了可移植性,可以不需要修改就运行在上述四种框架的最近版本上。
.NET标准不是一套框架;它仅仅是一个描述(类型和成员的)最小功能集基线的规范,以保证特定框架间的兼容性。这个概念和C#的接口很相似:.NET标准类似一个接口,而框架是实现接口的具体类型。
5.1.1 旧版本的.NET标准
除了.NET标准2.0外,还有一些现存的旧版本的.NET标准,主要是:1.1、1.2、1.3和1.6。更高的版本号意味着对低版本号的扩展。例如,如果一个程序库的目标标准为1.6,那么该程序库不仅可以兼容前面提到的四个版本的最近版本,还可以兼容.NETCore 1.0。而如果该程序库支持.Net标准1.3,那么它可以支持包括.NET Framework4.6.0在内的所有框架。
2.0标准相比1.x标准增添了几千个API。因此从2.0转1.x,支持1.x的标准是非常困难的。如果你需要支持更老的框架,但是不需要跨平台的兼容性,那么更推荐将程序库的目标框架设置为特定版本的框架。
5.1.2 引用程序集
为了编译程序,必须将程序中使用的程序集(程序集中包含了应用程序需要的那一部分框架功能)引用进来。例如使用了LINQ-to-XML查询的简单的.NET Framework控制台应用程序需要引用mscorb.dll、System.dll、System.Xml.dll、System.Xml.Linq.dll以及System.Core.dll。
在Visual Studio中,可以在项目中添加引用来引用程序集。引用程序集仅仅是编译器的需要,运行时的程序集并不要求和编译时引用的程序集保持一致。因此,在编译时,可以使用一种特殊的,只包含外壳而不包含任何编译代码的引用程序集。而这正是.NET标准的工作原理:我们引用的程序集称为netstandard.dll,它包含了所有.NET标准2.0中的类型和成员,当并不包含实际编译的代码。后续则通过程序集重定向特性,在运行时加载“真正的”程序集。
在引用程序集时,也可以将目标框架版本设定为比机器上安装的框架版本低的版本。例如&#