[.NET大牛之路 005] .NET 的执行模型
.NET大牛之路 • 王亮@精致码农 • 2021.07.06
前面我们介绍 .NET 历史时讲过,微软基于 .NET Framework 重新设计并创造了跨平台的 .NET Core,目前已经发展到 .NET 5 版本,它的性能较之前的 .NET Framework 有巨大的提升。而 .NET Framework 产品线也被宣告终止(微软仍会继续维护,只是不会再发布新版本),它的最后个版本 .NET Framework 4.8 成为了绝唱。
.NET Framework 终将成为历史,我们要把思想从 .NET Framework 跳到 .NET Core/.NET 5+,首先要弄明白它们的执行模型和底层架构发生了什么变化。
注:为了简单起见,下文所说的 .NET Core 包含 .NET Core 和 .NET 5+。
我们先从一个高的角度来理解一下 .NET Core 执行模型的全貌,后面章节再从低的角度逐个拆开讲解各个模块。
.NET Core 的执行模型有两种,一种是基于 CoreCLR 运行时,这种和 .NET Framework 的执行模型几乎一样;另一种是基于 Native AOT 本地运行时,这是 .NET Core 新增的一种执行模型。
基于 CoreCLR
CoreCLR 和原来 .NET Framework 的 CLR(Common Language Runtime,公共语言运行时)几乎是一样的,只是 CoreCLR 去除了特定于 Windows 操作系统的部分,实现了跨平台。所以除了 CLR 运行时有些不同之外,它们的执行模型是一样的。
注意,平时我们会把 CoreCLR 习惯性地简称为 CLR,在 .NET Core 语境中,CLR 指的就是 CoreCLR。
基于 CoreCLR 的执行模型用简单流程图表示如下:

源代码经过编译器编译,生成程序集,运行的时候,再由 CLR 针对不同的操作系统和 CUP 架构(如 x86、x64 或 ARM)把程序集编译成本地代码(Native Code),本地代码可由操作系统直接运行。
注:在 .NET 中,本地代码就是机器码(Machine Code),只是叫法不同。它是处理器能够理解并直接执行的字节码指令。所有其他代码必须翻译或转换为机器码才能在计算机上运行。
基于 Native AOT
.NET Core 基于 CoreCLR 提炼出了一个精简版的本地运行时,移除了 JIT 编译器,保留了垃圾回收器、内存管理等模块。这个本地运行时之前的代号叫 CoreRT ,现在叫 Native AOT 。
Native AOT 运行时提供了一套 AOT(Ahead Of Time) 提前编译机制,它使用的是新一代的 RyuJIT 编译器,可以将 .NET Core 程序编译成本地代码(机器码),可在宿主机器直接运行,不需要提前安装 .NET Core 运行时。
基于 Native AOT 运行时的执行模型用简单流程图表示如下:

源代码经过编译器编译,直接生成本地代码,发布时将本地代码和本地运行时一起打包为单个可执行文件,可直接在操作系统上运行。
要使用本地运行时,在 VS 中发布时请选择 Self-Contained 模式,同时需指定目标平台及 CPU 架构(如win-x64、linux-x65等)。由于打包的文件包含本地运行时,所以它要比基于 CoreCLR 发布的文件要大几十兆。
使用 Native AOT 本地运行时有两大好处:一是发布时只有一个文件,已经包含本地运行时,不需要提前安装运行时环境,可直接在宿主机上运行;二是启动时本身就是机器吗,不要经过 JIT 编译器编译,启动效率更高。
小结
.NET Core 基于 CoreCLR 的执行模型和原来 .NET Framework 的执行模型是一样的,没有发生大的变化。另外,.NET Core 新增了一种基于 Native AOT 本地运行时的执行模型,它使用了 AOT 编译机制,可直接把 .NET Core 程序编译成机器码。
希望大家根据文中的流程图理解 .NET Core 两个执行模型的全貌,并牢记。这有助于我们理解 .NET 程序的运行原理,也是面试的高频话题。关于执行模型中的主要核心模块(编译器、程序集和运行时),后面的章节再单独详细讲解。
[.NET大牛之路 005] .NET 的执行模型的更多相关文章
- [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件
在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...
- [ASP.NET MVC 大牛之路]03 - C#高级知识点概要(2) - 线程和并发
本人博客已转移至:http://www.exblr.com/liam 我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验给大家一些指引,带着大家一起 ...
- [ASP.NET 大牛之路]02 - C#高级知识点概要(1) - 委托和事件
在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...
- [.NET大牛之路 006] 了解 Roslyn 编译器
.NET大牛之路 • 王亮@精致码农 • 2021.07.09 维基百科对编译器的解释是:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言).编译是从源代码(通 ...
- [.NET大牛之路 007] 详解 .NET 程序集
.NET大牛之路 • 王亮@精致码农 • 2021.07.13 上一篇我们介绍了 Roslyn 编译器,我们知道,我们编写的 C#/VB 代码经过 Roslyn 编译器编译后会生成程序集文件.按照之前 ...
- [ASP.NET MVC 大牛之路]01 - 开篇
匆匆2014,转眼就到末尾了.在这一年,你还有哪事情些想做而没有做? 2014年在我身上发生了两件意义重大的事,一是正月初一宝宝出生,我升级成为了爸爸:二是进入了一家创业公司,成为了技术负责人. 去年 ...
- Scala进阶之路-进程控制之执行shell脚本
Scala进阶之路-进程控制之执行shell脚本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,我这里直接放一个案例. /* @author :yinzhengjie ...
- Python之路 - Socket实现远程执行命令
Python之路 - Socket实现远程执行命令 os模块实现
- [ASP.Net] 转 > ASP.NET MVC 大牛之路
URL: http://www.cnblogs.com/willick/ [ASP.NET MVC 大牛之路]01 - 开篇 [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - ...
随机推荐
- 熬夜总结vue3中setUp函数的2个参数详解
1.setUp函数的第1个参数props setup(props,context){} 第一个参数props: props是一个对象,包含父组件传递给子组件的所有数据. 在子组件中使用props进行接 ...
- 图的存储与遍历C++实现
1.图的存储 设点数为n,边数为m 1.1.二维数组 方法:使用一个二维数组 adj 来存边,其中 adj[u][v] 为 1 表示存在 u到 v的边,为 0 表示不存在.如果是带边权的图,可以在 a ...
- bootstrap validate 验证插件
1.需要引入bootstrapValidator.min.js 2.在需要验证的控件中添加 class="form-control" 3.js中写验证的方法 $('#psasave ...
- JDK8安装包的下载安装方式以及环境变量的配置
前面我们介绍了 <Java是什么?>.<OracleJDK是什么?OracleJDK的版本怎么选择?>.<OpenJDK是什么?>以及<OracleJDK 与 ...
- CentOS 8 按tab键不能自动补全问题解决方案
CentOS中按tab键不能自动补全问题解决办法 检查一下系统有没有安装bash-completion包 [root@Sonarqube ~]# rpm -lq bash-completion yum ...
- ESP32-任务看门狗笔记
看门狗机制用于监控嵌入式系统运行并在发生不可知的软硬件故障时将系统复位.系统正常运行时,看门狗定时器溢出之前会被重置计数值,也就是"喂狗".定时器溢出意味着无法"喂狗&q ...
- C语言相关知识
1.指针:在程序中定义了一个变量,在进行编译时就会给该变量再内存中分配一个地址,通过访问这个地址可以找到所需变量,这个变量的地址成为该变量的指针.指针看作是内存中的一个地址,多数情况下,这个地址是内存 ...
- centos7 U盘安装及Raid划分的完整流程
目录 一.Centos7的新特性: 二.安装方法与准备工作(U盘镜像) 1. 安装方法介绍 2. Centos iso 常用镜像下载地址: 3. UltraISO制作U盘系统镜像 3.1 准备工作: ...
- 重新梳理调度器——GMP 调度模型
调度器--GMP 调度模型 Goroutine 调度器,它是负责在工作线程上分发准备运行的 goroutines. 首先在讲 GMP 调度模型之前,我们先了解为什么会有这个模型,之前的调度模型是什么样 ...
- Python之抖音快手代码舞--字符舞
先上效果,视频敬上: 字符舞: 代码舞 源代码: video_2_code_video.py 1 import argparse 2 import os 3 import cv2 4 import s ...