.NET Core基础理论
1、.NET Core基础理论
1.1、重要工具
.NET FlatForm下的项目:https://github.com/dotnet/
查看.NET Core源码:https://github.com/dotnet/runtime
查看asp.net Core源码:https://github.com/dotnet/aspnetcore
.Net Core 扩展库:https://github.com/dotnet/extensions
最重要的是:https://github.com/dotnet/runtime
asp.net Core和.NET Core是两个相对独立的技术栈。asp.net Core并不绝对依赖哪个.NET框架。.NET基金会还没有决定.NET Core开源的时候,ASP.NET MVC就已经开源了。
asp.net Core是一个上层开发框架,没有底层框架.NET core。运行时.net core mono。
Mac版的VS前身不是VS,是Xamarin Studio,MonoDevelop衍生来的。
从.NET FrameWork迁移到.NET Core怎么做?
升级.NET Core的版本,哪里不兼容。
.NET迁移分析工具,分析项目的源代码,并且生成分析报告。
1.2、重要组件
.NET Core并不是一个单独的开源项目,它是由很多个开源项目构成的项目集合。它的核心由四个支柱项目构成:Core CLR、CoreFx、CLI、Rolsyn。
(1) Core CLR:它是最核心的部分,是.NET Core的公共语言运行时,由C++编写实现的。相当于java的JRE。Core CLR是由是由.NET FW的CLR发展而来的。结构上与CLR是一致的。
Core CLR的组成部分或主要功能:
CLR的第一职责就是执行.NET程序。.NET程序和C或C++这些语言编译出来的程序由很大区别。原生程序(包含了特定硬件架构的机器码,调用特定系统的接口,只能在某一个特定平台执行)。
.NET程序:中间代码,不依赖平台,可以不同的平台运行。
Core CLR解析中间代码,翻译成目标平台的机器码,生成元数据(类型信息、GC信息、异常信息)支持各种机制。
CLR把已经编译过的IL加载到内存中的部分是class Loader的部分,翻译代码的叫做JIT。
目前代码的执行路径、操作系统、硬件情况,编译出最适合当前计算机执行的高效的汇编代码。
JIT是IL(中间语言,MSIL)的编译器,并不是C#的编译器。
CLR为了保证类型安全。类型安全指的是.NET程序保证对象类型一定正确。
CLR提供了异常处理机制。传统的机制使用函数返回值通知和处理错误,实现起来很有难度。这部分也是在CLR中处理的。
线程机制,CLR对原生的线程以及同步对象进行了包装,所以,在托管平台上,可以使用相同的方式,在不同的平台进行多线程处理。
自动内存管理,垃圾回收机制(简称GC),也在CLR中。在我们分配资源的时候,可以不用理会。
GC会一直关注内存的变化,在适当的时候启动并对内存中无效的对象执行销毁操作,进行内存的回收和管理。GC只能自动销毁CLR托管的对象,非托管对象(如,文件句柄),非托管资源都使用了托管代码包装,所以,一般情况下可以不用手动处理。而是托管释放的,封装过了。。。这就不是GC做的事情。
(2)CoreFx和CoreCLR还是两个项目,但是合并到了同一个仓库,是为了方便开发者。Core FX是.NET Core的基础类库,完全由C#语言编写,是库函数项目。如:system.DateTime类型。在.NET 5中,项目的名称变了,改为Libraries==Core FX。
基础类库的作用:减少.NET 开发人员的工作量;可以让不同模块之间的数据交互更加容易。
Core FX大多数代码都是从.NET FrameWork的BCL里移植过来的。
Core FX为了兼容多个操作系统,大量的使用了parial关键字(部分类)。将多平台公用的代码放在一个源代码文件中,具体某个操作系统相关的代码放在另一个与平台相关的源代码文件中。
不同的CLR,跨平台。不同的平台有不同的CLR。还有Framework、Mono等不同实现。
功能是有差异,又提出了.NET Standard,即.NET标准(.NET Standard不是库,是标准)。在原有的框架类库中划分了一部分最基础的功能,被不同的CLR实现,.NET标准版本越高,要求支持的功能越多。。。
.NET Framework 4.6.1和.NET Core 2.0都支持.NET标准2.0。如果采用.NET 标准2.0的项目,那么可以在.NET Framework 4.6.1和.NET Core 2.0上运行。.NET Framework 4.6.1不支持.NET标准2.0,支持.NET标准1.3。为了兼容.NET标准,.NET开发团队在迁移的时候都是按照这来的。
(3) CLI:
CLI有2个。common Language Infrastructure通用中间语言;Command Line Interface命令行接口
通用中间语言是公开的技术标准,定义了一个不依赖于具体操作系统与硬件架构的中间语言,以及执行这个语言所需的运行环境。在C#中,int类型不管是任何平台永远是4!
CLI的特性:跨平台、跨语言。
我们通常不会直接编写IL,而是先编写高级语言,再使用工具(Roslyn)转换到中间语言。
中间语言定义的标准里面就是一些定义规范:int、long、string的模样,有哪些类型、指令的种类、方法的结构、模块的结构、二进制文件的格式。。。。
高级语言编译成中间语言(IL)后,就会公用这种标准。
通用中间语言与.NET Core没有任何关系。
Command Line Interface命令行接口 才与.NET Core有关。以前.Net Framework只支持Windows。Win32 GUI工具不支持linux的文件系统,可执行文件格式。
.NET Core目标就是跨平台,需要设计一款多平台统一、高效,便于使用的.NET Core工具,很不容易的事情。
CLI是一个独立的项目。
很有难度的问题:.NET Core编译生成的二进制,到底是针对不同的操作系统生成不同的文件格式,还是生成统一的文件格式?.NET Core生成统一的文件格式。
.NET Core跨平台开发,无论是win还是linux,.NET Core编译出来的二进制文件都是DLL,还都是PE格式。
.NET Core必须提供一个容器,来保证所有操作系统平台都可以接在PE格式的DLL文件上。
CLI工具是在.NET Core 2.0才固定下来的。
整个CLI项目不同的语言开发的多个工具组成,后来变成了一个工具dotnet,可以用来项目管理、项目构建、代码运行、包管理。
(4) Rolsyn
它是.NET上的高级语言编译器。可以编译C#、VB.NET、F#。
确切的来说,Rolsyn被微软定义为下一代编译平台,而不仅仅是编译器。
因为除了代码编译外,它还提供了代码分析服务、丰富的API。
在Rolsyn之前,C#的编译器是CSC。相对来说,Rolsyn生成的IL更加高效、编译时间也大大缩短。
从VS2017开始,代码编译的时候,Rolsyn提供了动态编译功能。类的头上被几个引用
C#是由Rolsyn编译为IL。
以前这4个开源项目都是独立的仓库。
1.3、常见问题解析
.NET Core定义:小型的、高效的、可以通过文件复制直接部署的跨平台框架。
.NET Core备受大家关注的原因?
(1) 自身是开源的,鼓励更多的.NET项目开源。
对于传统的.NET开发人员,但也不是什么熟悉的东西。
开源许可协议、开源协议。
为了体会到时代的变迁有多大,2000年代初期的时候,微软的高管们是怎么评价开源的:开源是对知识产权的严重破坏。
现在的微软把GITHUB收购了,这种变化与.NET基金会有很大的关系。
.NET基金会是一个独立的组织,支持.NET社区和开源,目的是拓宽和加强.NET生态系统。2014年微软开头组建,创始人有6个,但这6个都不是微软的员工。直到2019年改选,才有了一名微软的员工。其余的都是MVP以及其他的很多知名公司(如亚马逊、谷歌、三星)。
.NET Core的源码以及.NET Core周边的一些开源项目,都是这个基金会的重要资产。
开源项目基本上遵循MIT许可协议,才让.NET Core有极大的开放性和移植性。
当前主流的四种软件许可协议:GPL、Apache、BSD、MIT。
这些协议的目的:为了保护和尊重作者的知识产权,即便是开源,也不是说明源代码可以随意使用!!
GPL协议:对开源软件的使用限制最严格,而且具有极高的传染性。核心思想:让全世界上的软件都开源!如果你的软件,用了甚至是它的衍生,也必须用GPL协议。这对商业软件构成了很大的挑战。因为这个核心思想,发展的并不好。从而出现了一个变体LGPL。如果商业软件仅仅是引用LGPL许可协议下的软件,那么无须开源,但是如果对LGPL下的源代码进行了修改,那么就必须开源。曾经中国发生的一件侵权的事件,安卓TV版的软件。其他的开发者偶然发现,告诉了被引用的原作者。
Apache协议:是Apache基金会创立的。广泛了存在于Apache的软件中。该协议鼓励开源软件的使用者充分尊重软件的原作者。如果用了Apache协议,仅需注明你用了以及作者信息。如果你对Apache西医的项目有了修改,发布时,对你继续进行的修改说明。他不强制要求开源。
BSD和MIT是最宽松的协议,鼓励开发者自由的使用、自由的修改、自由的发布。二者区别:BSD额外规定如果你对BSD下的软件源码进行了修改再发布,那么你不能借用该项目原作者的名义进行宣传。
.NET Core全系列的开源项目都采用MIT协议。它可以被无限制的修改、移植、打包、发布。这才是.NET Core的最大驱动力。
(2)跨平台
(3)性能高效。比.NET Framework更加优秀,也比其他同级开源框架高效。