DotNet-Advanced-Series-3-1-BasicTheory


.NET Core 到底是什么?
.NET Core 是小型的、高效的、可以通过文件复制直接部署的跨平台框架。

备受大家关注?

  1. .NET Core 自身开源,而且鼓励更多的 .NET 项目开源
  2. .NET Core 支持跨平台特性,可以在Windows、Linux、macOS等系统上运行
  3. .NET Core 的性能不仅比 .NET Framework 更加优秀,也比其它同级开源框架高效

开源

开源对传统的.NET开发人员,但也不是什么熟悉的东西。

时代的变迁有多么巨大,2000年代初期的时候,微软的高管们是怎么评价开源的:严重破坏

你看看现在的微软。GITHUB都给收了,这种变化与.NET基金会有很大的关系。

.NET 基金会由微软牵头组建,其重要资产主要是 .NET Core 的源代码以及.NET Core周边的一些开源项目。

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

2014微软牵头组建,创始人有6个,都不是微软的员工。

2019年.NET基金会改选了一次,才有了一名微软 的员工。

MVP,很多知名公司(亚马逊、谷歌、三星)

.NET Core的源码以及.NET Core周边的一些开源项目,都是这个基金会的重要资产。

开源项目基本上遵循MIT许可协议,极大的开放性和移植性。

四种开源协议 GPL\Apache\BSD\MIT

目的是为了保护和尊重作者的知识产权,即便是开源,也不说明源代码可以随意使用!!

GPL

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

核心思想:让全世界上的软件都开源!甚至是它的衍生,也必须用GPL。

这对商业软件构成了很大的挑战。

GPL发展的并不好,变体LGPL仅仅是引用LGPL许可协议下的软件,那么无需开源。

曾经中国发生的一件侵权的事件,其他的开发者偶然发现,告诉了被引用的原作者。。

Apache

Apache 广泛的存在于Apache的软件。

鼓励开源软件的使用者充分尊重软件的原作者:

注明你用了,以及作者信息。

你对阿帕奇协议的项目有了修改,发布时,对你继续进行的修改说明。

他不强制要求你开源。

BSD和MIT

最宽松的协议,自由的使用,自由的修改,自由的发布。

这两者差不多!!

BSD额外有一个规定:如果你对BSD协议下的软件的源码进行了修改再发布,那么你不能借用该项目原作者的名义进行宣传。

没什么坏处!

.NET CORE全系列的开源项目都采用MIT协议。无限制的修改、移植、打包、发布。这是net core最大的驱动力。

.NET Core的重要组件

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

核心是由四个支柱项目构成:CoreCLRCoreFxCLIRolsyn

CoreCLR

CORE CLR,.NET Core的公共语言运行时,C++编写实现的。

.NET FW 的CLR发展而来的。结构上与CLR是一致的。

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

原生程序:特定硬件架构的机器码,调用特定系统的接口,只能在某一个特定平台运行。

.NET 程序:中间代码,不依赖平台,不同的平台运行。

解析中间代码,翻译成目标平的机器码,生成元数据(类型信息、GC信息、异常信息)

把已经编译过的IL加载内存中的部分是Class Loader。

翻译代码的是JIT,是CLR的一部分。

目前代码的执行路径、操作系统、硬件情况,最适合当前计算机执行的高效的汇编代码。

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干的。

Core FX

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 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

CLI, Common Language Infrastructure,通用中间语言
CLI, Command Line Interface 命令行接口
如果站在整个微软的生态来说CLI,那么我们是在说通用中间语言;如果在net core里面说CLI,那么就是在说命令行接口。

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

C语言的标准int类型的长度最少为2个字节,实际多少是不确定的,32位4个字节,64位8个字节。

int类型永远是4!

特性一:跨语言
我们通常不会直接编写IL,先编写高级语言再使用工具(Roslyn)转换到中间语言。

标准里面一些定义:有哪些类型int\long\string、指令的种类、方法的结构、模块的结构,二进制文件的格式。。

高级语言(C#\F#)都可以转换成同一种IL语言,

.NET Core 里说CLI

说的是这个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.NET\F#。

确切的来说,Rolsyn被微软定义为下一代编译平台,而不仅仅是编译器。

代码编译外,提供了代码分析服务丰富的API

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

从VS2017开始,代码编辑的时候,Roslyn提供的动态编译功能。有没有敲错,不需要编译就能知道,还有类上面提示被引用了多少次等信息。

.NET Core源码

ASP.NET Core它并不绝对依赖哪个.NET 框架。

.NET基金会还没有决定把.NET Core 开源的时候,ASP.NET MVC就已经开源了。

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

.NET 标准
.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 是一个上层开发框架,没有了底层框架,啥也干不了。net core 和 mono就是底层框架。

运行时 .netcore mono

重要工具

Mac版的VS

是不是觉得不好用,觉得超级难用,为什么难用?

Mac版的VS前身不是VS,是Xamarin Studio,MonoDevelop衍生来的。

VS CODE,Rider 也觉得不好用。

下面有两个问题:

  • 从.NET FW迁移到.NET Core 怎么做?
  • 升级.NET Core的版本,哪里不兼容?

1.针对项目源代码看能否迁移
.NET Portability Analyzer
可以在扩展里面安装。

.NET迁移分析工具,分析项目的源代码,并且生成分析报告。
帮我们去找到不谦容的API。

2.针对Nuget引用看能否迁移
https://icanhasdot.net/
第三方引用 NUGET,不是项目上传,csproj上传,这个文件就可以。

反编译:

  • Dnspy
  • Ilspy

几个常见问题

1..NET 标准不是程序 和.NET Core有什么区别?
.NET Core是可以执行托管的运行时平台,.NET 标准是一堆文本.

2.什么情况下使用.NET 标准编写应用程序?
编写是一个exe,可执行的,不需要用.NET 标准。
如果编写的是通用的类库,既可以给framwork用,也可以给net core用,那就要用.NET 标准。

3..NET Core能不用使用.NET 标准的类库
肯定可以。
反过来,.NET 标准是不是可以用Net Core的类库呢?
也可以,但是你要注意版本问题,就不那么通用。。

4.有些已经被纳入.NET 标准的API,会不会出现问题。
异常 NotSupportedExcepotion
有一些API在某几个.NET框架中支持,在另外的一种 不支持,仍然有可能被集成到.NET标准。

例如: AppDomain.CreateDomain在linux里是不支持的。

5.Net Core 3.1可用任何版本的.NET 标准

6..NET Core和.NET FW的性能差距?
确实很巨大,.NET Core 做了很多改进,简化内部的指令数量,降低性能开销。
两个项目,就用最基本的集合。


文章作者: Chaoqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chaoqiang !
评论
 上一篇
DotNet-Advanced-Series-3-2-CommandLine DotNet-Advanced-Series-3-2-CommandLine
主要内容: dotnet new 命令,创建项目 dotnet sln 命令 ,管理解决方案 dotnet reference 管理项目间引用 dotnet package 管理项目引用包 dotnet build 项目构建 dotnet
下一篇 
DotNet-Advanced-Series-5-2-MicroService DotNet-Advanced-Series-5-2-MicroService
1. 主要内容概要①微服务架构解析,优缺点、挑战与转变②MicroService全组件解析③Consul注册,心跳检测,服务发现 2. 架构演进单体应用单体应用时代:应用程序就是一个项目,在一个进程里面运行。 开发简单,集中管理,没有分布
  目录