基础理论

简介:

NET Core是一个开源通用开发平台。您可以使用多种编程语言为Windows,macOS和Linux创建适用于x64,x86,ARM32和ARM64处理器的.NET Core应用程序。提供了用于物联网客户端UI机器学习的框架和API 

.NET Core官方文档

优势:

  • 性能高、启动快:有span<T>、Memory<T>等高性能类型
  • 跨平台: 可以在 Windows、macOS 和 Linux 操作系统上运行。
  • 跨体系结构保持一致: 在多个体系结构(包括 x64、x86 和 ARM)上以相同的行为运行代码。
  • 命令行工具: 包括可用于本地开发和持续集成方案中的易于使用的命令行工具。
  • 部署灵活: 可以包含在应用或已安装的并行(用户或系统范围安装)中。 可搭配 Docker 容器使用。

Core FX(Libraries):是.NET Core的基础类型

.NET CORE 并不是一个单独的开源项目,很多个开源项目所构成的一个项目集合。
核心是由四个支柱项目构成:CoreCLR、CoreFx、CLI、Rolsyn 

.NET Core 到底是什么?
小型的、高效的、可以通过文件复制直接部署的跨平台框架。
 
备受大家关注?
.NET Core自身是开源,鼓励更多的.NET 项目开源
跨平台
性能,高效,.NET FW 更加优秀,也比其它同级开源框架高效
 
传统的.NET开发人员,但也不是什么熟悉的东西。
 
开源许可协议、开源协议
 
时代的变迁有多么巨大,2000年代初期的时候,微软的高管们是怎么评价开源的:
严重破坏。
 
你看看现在的微软。GITHUB都给收了,这种变化与.NET基金会有很大的关系。
 
独立的组织,支持.NET社区和开源。
 
2014微软牵头组建,创始人有6个,都不是微软的员工。
2019年.NET基金会改选了一次,才有了一名微软 的员工。
MVP,很多知名公司(亚马逊、谷歌、三星)
.NET Core的源码以及.NET Core周边的一些开源项目,都是这个基金会的重要资产。
开源项目基本上遵循MIT许可协议,极大的开放性和移植性。
 
四种:GPLApacheBSDMIT
 
目的是为了保护和尊重作者的知识产权,即便是开源,也不说明源代码可以随意使用!!
 
 
GPL对开源软件的使用限制最严格的,具有极高的传染性。
 
核心思想:让全世界上的软件都开源!甚至是它的衍生,也必须用GPL。
 
商业软件构成了很大的挑战。
发展的并不好,变体LGPL仅仅是引用LGPL许可协议下的软件,那么无需开源。
 
曾经中国发生的一件侵权的事件,其他的开发者偶然发现,告诉了被引用的原作者。。
 
Apache 广泛的存在于Apache的软件。。
鼓励开源软件的使用者充分尊重软件的原作者:
注明你用了,以及作者信息。
 
你对阿帕奇协议的项目有了修改,发布时,对你继续进行的修改说明。
他不强制要求你开源
 
 
BSD和MIT
 
最宽松的协议,自由的使用,自由的修改,自由的发布
 
差不多!!
BSD额外有一个规定:如果你对BSD协议下的软件的源码进行了修改再发布,那么你不能借用该项目原作者的名义进行宣传。
没什么坏处!
 
.NET CORE全系列的开源项目都采用MIT协议。无限制的修改、移植、打包、发布。
最大的驱动力。。
 
 
.NET COre的几个重要组件!!
 
.NET CORE 并不是一个单独的开源项目,很多个开源项目所构成的一个项目集合。
核心是由四个支柱项目构成:CoreCLR、CoreFx、CLI、Rolsyn
 
CORE CLR,.NET Core的公共语言运行时,C++编写实现的。
.NET FW 的CLR发展而来的。结构上与CLR是一致的。
 
CLR的第一职责就是执行.NET程序,.NET程序和CC++这些语言编译出来的程序很大区别。。
原生程序:特定硬件架构的机器码,调用特定系统的接口,只能在某一个特定平台运行。
 
.NET 程序:中间代码,不依赖平台,不同的平台运行。
 
解析中间代码,翻译成目标平的机器码,生成元数据(类型信息、GC信息、异常信息)
 
把已经编译过的IL加载内存中的部分是Class Loader。
翻译代码的是JIT。
 
目前代码的执行路径、操作系统、硬件情况,最适合当前计算机执行的高效的汇编代码。。
JIT是IL(中间语言,MSIL)的编译器,并不是C#的编译器。
 
 
CLR为了保证类型安全,类型安全指的是.NET程序保证对象类型一定正确。
C语言中,int* void*,传递其他地方,他是无法判断这个指针的真实类型是int还是long,错误的把void转成long,也不会发生异常。
 
string类型object,传递到其它地方,通过GetType这个方法判断这个对象的真实类型。
 
为了实现类型安全,CLR每个引用类型的对象中保存类型信息,由CLR管理的对象就被称作托管对象。
 
CLR提供了异常处理机制。传统的机制使用函数返回值通知和处理错误,实现起来很有难度。也是在CLR处理。
 
线程机制,CLR对原生的线程以及同步对象进行了包装,使用相同的方式,在不同的平台进行多线程处理。
 
自动内存管理,垃圾回收机制(GC),也在CLR。
不能及时回收,内存不足。
GC会一直关注内存的变化,在适当的时候启动并对内存中无效的对象执行销毁操作,进行内存的回收和管理。。
GC只能自动销毁CLR托管的对象,非托管对象,文件句柄,非托管的资源,都是用了托管代码包装。而是托管释放的,封装过了。。这就不是GC干的。。
 
GC咱们后面还会讲。
 
Core FX是.NET Core的基础类型。完全由C#语言编写,库函数项目。
System.DateTime类型,到了.NET 5,项目的名字变了,Libraries = CoreFx
 
基础类库:减少.NET开发人员的工作量;可以让不同模块之间的数据交互更加容易。
 
两个类库使用不同的时间类型,内置的类型越丰富,各个模块共同使用的类型就越多。
 
Core FX大多数代码都是从.NET FW的BCL里移植过来的。。
 
多个操作系统,大量的使用了parial关键字,部分类。。
 
多平台功用的代码放在一个源代码文件中,具体某个操作系统相关的代码放在另一个与平台相关的源代码文件中。
 
不同的CLR,跨平台,不同的平台有不同的CLR,还有Framework、Mono
 
功能是有差异,
.NET Standard
.NET 标准
框架类库中划分了一部分最基础的功能,被不同的CLR实现,.NET 标准版本越高,要求支持的功能越多。。
 
.NET FW 4.6.1 和.NET Core 2.0 都支持.NET 标准 2.0.
.NET FW 4.6 不支持 .NET 标准 2.0,支持.NET 标准1.3 .
 
为了兼容.NET 标准,迁移的时候。。
 
 
CLI
Common Language Infrastructure,通用中间语言
 
公开的技术标准,定义了一个不依赖于具体操作系统与硬件架构的中间语言(IL),以及执行这个语言所需的运行环境。
C语言的标准int类型的长度最少为2个字节
int类型永远是4!特性:跨平台
 
跨语言
我们通常不会直接编写IL,先编写高级语言再使用工具(Roslyn)转换到中间语言。
标准里面一些定义:有哪些类型intlongstring、指令的种类、方法的结构、模块的结构,二进制文件的格式。。
高级语言(C#F#)都可以转换成同一种IL语言,
 
 
.NET Core 里说CLI
Command Line Interface 命令行接口
 
以前.NET FW只支持win,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,项目管理、项目构建、代码运行
、包管理。
 
 
Rolsyn
.NET上的高级语言编译器,C#、VB.NETF#。
 
确切的来说,Rolsyn被微软定义为下一代编译平台,而不仅仅是编译器。
 
代码编译外,提供了代码分析服务,丰富的API。
C#的编译器csc,生成IL更加高效、编译时间也大大缩短。。
 
从VS2017开始,代码编辑的时候,Roslyn提供的动态编译功能。
 
 
.NET Core源码
 
 
 
以前这四个开源项目都是独立的四个仓库
 
ASP.NET Core它并不绝对依赖哪个.NET 框架
.NET基金会还没有决定把.NET Core 开源的时候,ASP.NET MVC就已经开源了。
 
ASP.NET Core和.NET Core是两个相对独立的技术栈,
 
.NET 标准
 
.NET 经过很多年的发展,客户端Unity游戏引擎C#语言,手机游戏
用来开发客户端的Xamarin,Linux macOS IOS Android
 
发展到了离散化的趋势,
这些差异对于.NET最初提出来的 一次编译、随处运行 是相悖的。。
 
.NET 基金会 对.NET 开发框架规范,要求最大可能地保证.NET应用程序的通用性和移植性。
 
.NET标准是一堆规范文本,不是程序,不是类库,纯文本编写函数声明信息,用来规范相同的类型和函数在不同的.NET开发框架中具有的不同的形态。。
无缝的在各种开发框架之间进行迁移,所有支持.NET标准的开发框架都有义务按照.NET标准规范实现相应的函数声明。
 
 
.NET 标准 2.1 ,
1.x版本和2.x版本,任务是规范现在函数的生命和调用
未来!!.NET 标准 3.x 将会主导.NET的发展,标准先行,其他的框架都来实现
ASP.NET Core 是一个上层开发框架
运行时 .netcore mono
 
 
纯文本内容
 
重要的概念
 
重要工具
 
Mac版的VS
我也觉得不好用,我觉得超级难用,为什么难用吗?
 
前身不是VS,Xamarin Studio,MonoDevelop衍生来的
 
VS CODE,Rider我也觉得不好用。
 
从.NET FW迁移到.NET Core 怎么做?
升级.NET Core的版本,哪里不兼容
 
.NET Portability Analyzer
.NET迁移分析工具,分析项目的源代码,并且生成分析报告。
 
帮我们去找到不谦容的API
 
https://icanhasdot.net/
第三方引用 NUGET,不是项目上传,csproj上传
 
 
Dnspy
Ilspy
 
.NET 标准不是程序和.NET Core有什么区别?
.
 
什么情况下使用.NET 标准编写应用程序。
编写是一个exe。通用的类库。
 
.NET Core能不用使用.NET 标准的类库
 
也可以,但是你要注意版本问题,就不那么通用。。
 
 
有些已经被纳入.NET 标准的API,会不会出现问题。
异常 NotSupportedExcepotion
 
有一些API在某几个.NET框架中支持,另外的一种 不支持,仍然有可能被集成到.NET标准。。
AppDomain.CreateDomain
 
 
 
Net Core 3.1可用任何版本的.NET 标准
 
.NET Core和.NET FW的性能差距?
确实很巨大,.NET Core 做了很多改进,简化内部的指令数量,降低性能开销。

如有错误,欢迎您指出。
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/qingyunye/p/12706955.html