net core的介绍

1. .NET Core到底是什么

.NET Core是一种小型的、高效的,可以通过文件复制直接部署的跨平台框架。


.NET Core 备受关注的主要原因

1) .NET Core自身开源,而且鼓励更多的.NET项目开源

2).NET Core支持跨平台特性,可以再Windows、Linux、macOS等系统上运行

3).NET Core的性能不近比.NET Framework更加优秀,也比其他同级开源框架更高效


软件许可协议

遵循MIT开源许可协议,有极大的开放性和移植性,使用者可以无限制的修改、移植、打包、发布等。

对于传统的.NET开发人员,开源可能不是什么新鲜事物,但也有大部分人并不熟悉。

在2000年代初期,微软高管们是如何评价开源的,想知道么?

1)开源是对知识产权的严重破坏,我想象不到还有什么对软件和知识产权行业会有更大的伤害 --> 微软windows主管

2)历史证明,开源可能会占有一席之地,对于大众化的市场开源是肯定不会成功的 --> 微软某高级副总裁

但是,现在的微软呢?

不仅拥抱开源,而且很支持开源,甚至收购了github,这种变化与.NET基金会有很大的关系。

.NET基金会是一个独立的组织,包含很多知名企业(亚马逊、谷歌、三星等)、MVP等,由微软牵头组建,基金会的重要资产主要是.NET Core的源码以及.NET Core周边的一些开源项目。

.NET基金会的开源项目基本上都遵循MIT许可协议。


目前主流的开源协议

开源许可协议的目的是为了保护和尊重作者的只是产权,开源也并不代表源码可以随意使用。

GPL

对开源软件的使用限制最严格的,而且还具有极高的传染性。

核心思想:让全世界的软件都开源!只要你的软件中用到了任何第三方GPL协议的资源(甚至是它的衍生),就必须同样使用GPL开源协议。

对商业软件构成了很大的威胁,所以发展的并不好。

后期出现了变体LGPL协议,规定了如果仅仅是引用LGPL许可协议下的软件,那么无需开源,但如果对LGPL协议下的软件进行了修改并使用的,就必须要遵循LGPL协议。

Apache

Apache基金会所创建,广泛应用于Apache旗下软件产品。

鼓励开源软件的使用者应充分尊重软件的原作者,不再强制要求。如果使用了Apache协议下的软件,只需要在你的软件内注明使用方以及原作者信息即可。

如果你对Apache协议下的软件进行了修改并使用,在发布时需要添加修改说明,也不强制要求你的软件开源。

BSD&MIT

这两个协议是相对最宽松的协议,鼓励开发者自由的使用、自由的修改和发布,只需要在你的软件中保留原作者信息即可。

其中有一个区别,BSD规定,如果你对BSD协议下的软件修改并使用,那么你不能借用该项目原作者的名义进行宣传。

2. .NET Core的重要组件

.NET Core并不是一个单独的开源项目,而是由多个开源项目所构成的一个项目集合。

CoreCLR

.NET Core的公共语言运行时,是由C++编写实现,可以理解为JAVA中的JRE,。

从.NET Framework的CLR发展而来,结构上与CLR也是一致的。

CLR的第一职责,就是执行.NET程序,.NET程序和C/C++这些语言编译出来的程序有很大的区别。

C/C++编译出来的程序称之为“原生程序”,包含了特定硬件架构的机器码,还会调用特定的系统API,只能在特定的平台运行。

.NET程序编译后只是中间代码,不依赖平台,可以在不同的平台运行。

CLR实现了.NET程序在不同平台的运行,CLR解析中间代码,找到中间代码模块、类型成员等翻译成目标平台的机器码并生成元数据(类型信息、GC信息、异常信息等)。

编译过的IL通过Class Loader来加载到内存中。

再由JIT翻译为机器码。它会根据代码的执行路径、当前操作系统、硬件情况翻译为适合当前计算机执行的高效的汇编代码。

JIT是IL(中间语言MSIL)的编译器,不是C#的编译器!

CLR为了保证类型安全,是指.NET程序保证对象类型一定正确。为了实现类型安全,CLR为每个引用类型的对象中保存了类型信息,用来判断转换是否合法。比如string转换为object类型,被传递到其他地方后,通过GetType方法判断这个对象的真实类型,如果转换了错误的类型,将会抛出异常。

非类型安全的,比如C语言中,int* void*指针类型,被传递到其他地方后,他是无法判断这个指针的真实类型是int还是long,有可能会错误的把void转换成long,而且也不会发生异常,在程序执行过程中就会产生不可预估的错误。

CLR还提供了异常处理机制,传统的是使用函数返回值通知和处理错误的,这种方式实现简单,不需要运行时的支持,但一定程度上增加了开发者的复杂度。

线程机制,CLR对原生的线程以及同步对象进行了封装,对于托管代码开发者可以使用相同的方式,在不同的平台实现多线程处理。

提供了自动内存管理,也就是垃圾回收机制(GC),GC会监控内存变化,在适当的时候启动并对内存中无效的对象进行销毁,进行内存的回收和管理。GC只能自动销毁CLR托管的对象,对于非托管对象、文件句柄还是需要手动释放,但是CLR对于非托管资源也都使用了托管代码的封装,由托管释放而不是由GC操作。

CoreCLR和CoreFx 为了方便开发者,合并到了同一个仓库中。


CoreFX

是.NET Core的基础类库,这个类库完全由C#语言编写,是.NET Core提供给开发者的库函数项目。

在.NET 5中,项目的名字变了,Libraries。

其中,大多数人代码都是从.NET Framework的BLC移植过来的,经过了大量的优化修改和扩平台支持。。

例如,System.DateTime类型等等。

代码中,大量的使用了partial关键字,因为多平台共用的代码都被组织在对应的源代码文件中,具体某个操作系统相关的代码放在另一个与平台相关的源代码文件中。

不同的

带来的意义是什么

1)减少.NET开发人员的工作量

2)可以让不同模块之间的数据交互更加容易

CLI

单纯的提及CLI,有两种说法:

1)Common Language Infrastructure 通用中间语言

公开的技术标准,定义了一个不依赖于具体操作系统与硬件架构的中间语言(IL),以及执行这个语言所需的运行环境。

跨平台,比如C语言的标准int类型的长度最少为2个字节,实际多少并不固定(32位4字节,64位8字节),但是再CLI中规定,int类型永远是4字节!

跨语言,标准里面的部分定义:类型(int/long/string)、指令的种类、方法的结构、模块的结构、二进制文件格式等。我们通常不会直接编写IL,而是先编写高级语言,再使用工具(比如Roslyn)转换成中间语言。各种高级语言(C#/F#/VB...)都可以转成成统一中IL语言。

这个定义,与.NET Core 并没有多大关系,对于整个微软生态来说,通常CLI才指的是它!!!

2)Command Line Interface 命令行接口

以前的.NET Framework只支持windows,win32 GUI工具、Linux文件系统、包括可执行文件格式也不一样。

但.NET Core目标就是跨平台,实现一款多平台统一、高效,便于使用的.NET Core工具,这是相当复杂的工程,所以CLI是一个独立的项目。

比如,.NET Core编译生成的二进制,到底是针对不同的操作系统生成不同的文件格式,还是统一的文件格式?--> .NET Core选择的是生成统一的文件格式。例如,无论目标平台是win还是linux,.NET Core编译出来的二进制文件都是dll,且都是PE格式。

所以,.NET Core必须提供一个容器,来保证所有操作平台都可以加载PE格式的dll文件。

CLI工具,在.NET Core 2.0是在稳定下来,此前整个CLI项目由多种不同的语言开发的多个工具组成,之后只有一个工具dotnet,用于项目管理、构建、代码运行、包管理等等。

对于.NET Core,CLI通常代指的就是这个!!!


Roslyn

.NET上的高级语言编译器,可以编译C#、VB.NET、F#等。

但确切的来说,Rolsyn被微软定义为下一代编译平台,而不仅仅是编译器。除了代码编译外,还提供了代码分析服务,丰富的API等。

相对于之前的C#编译器csc,Rolsyn省的IL更加高效,编译时间也大幅度缩短。

从VS2017开始的代码编写过程中语法检查、成员引用统计等等功能便是由Rolsyn提供的动态编译所实现。


3. .NET Standard

.NET标准,由.NET基金会提出的.NET开发框架的规范文本。 --> 详见:.NET Standard

并不是程序,而是一组纯文本的类型和函数的声明信息,用来规范相同功能的类型和函数在不同的.NET开发框架中具有相同的形态。

基于.NET Standard规范的应用程序,就可以无缝地在各种开发框架之间进行迁移。

有支持.NET Standard的开发框架都有义务按照.NET Standard规范实现响应的函数声明。

框架类库中划分了一部分最基础的功能,被不同的CLR分别实现,.NET标准版本越高,要求支持的功能就越多。

例如.NET Framework 4.6.1和.NET Core 2.0都支持.NET标准2.0,那么实现了.NET标准2.0的类库可以在其中任何一个框架中使用,.NET Framework 4.6不支持.NET标准2.0,只支持.NET标准1.3,那么就不能兼容.NET2.0的类库。


简单点可以理解为,C#是由Rolsyn编译为IL中间语言的。


4. .NET Core的源码概览

.NET Platform:https://github.com/dotnet

coreCLR:https://github.com/dotnet/coreclr --> .NET Core 3.1及以前版本

coreFx:https://github.com/dotnet/corefx --> .NET Core 3.1及以前版本

runtime以及coreCLR、coreFX的后续版本合并仓库:https://github.com/dotnet/runtime

extensions:https://github.com/dotnet/extensions

--> 扩展库:依赖注入、日志、配置等等的扩展

aspnetcore:https://github.com/dotnet/aspnetcore


ASP.NET Core 和 .NET Core是两个相对独立的技术栈。

ASP.NET Core在3.0版本之前可以运行在.NET Framework、.NET Core、Mono上,也就是它并不绝对的依赖哪个.NET框架,在开源方面也是走在了.NET Core前面,因为在.NET基金会还没有决定把.NET Core开源的时候,ASP.NET MVC就已经开源了,并且也可以运行在Mono上。


net core的介绍


分享到:


相關文章: