.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-x64linux-x65等)。由于打包的文件包含本地运行时,所以它要比基于 CoreCLR 发布的文件要大几十兆。

使用 Native AOT 本地运行时有两大好处:一是发布时只有一个文件,已经包含本地运行时,不需要提前安装运行时环境,可直接在宿主机上运行;二是启动时本身就是机器吗,不要经过 JIT 编译器编译,启动效率更高。

小结

.NET Core 基于 CoreCLR 的执行模型和原来 .NET Framework 的执行模型是一样的,没有发生大的变化。另外,.NET Core 新增了一种基于 Native AOT 本地运行时的执行模型,它使用了 AOT 编译机制,可直接把 .NET Core 程序编译成机器码。

希望大家根据文中的流程图理解 .NET Core 两个执行模型的全貌,并牢记。这有助于我们理解 .NET 程序的运行原理,也是面试的高频话题。关于执行模型中的主要核心模块(编译器、程序集和运行时),后面的章节再单独详细讲解。

[.NET大牛之路 005] .NET 的执行模型的更多相关文章

  1. [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  2. [ASP.NET MVC 大牛之路]03 - C#高级知识点概要(2) - 线程和并发

    本人博客已转移至:http://www.exblr.com/liam  我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验给大家一些指引,带着大家一起 ...

  3. [ASP.NET 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  4. [.NET大牛之路 006] 了解 Roslyn 编译器

    .NET大牛之路 • 王亮@精致码农 • 2021.07.09 维基百科对编译器的解释是:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言).编译是从源代码(通 ...

  5. [.NET大牛之路 007] 详解 .NET 程序集

    .NET大牛之路 • 王亮@精致码农 • 2021.07.13 上一篇我们介绍了 Roslyn 编译器,我们知道,我们编写的 C#/VB 代码经过 Roslyn 编译器编译后会生成程序集文件.按照之前 ...

  6. [ASP.NET MVC 大牛之路]01 - 开篇

    匆匆2014,转眼就到末尾了.在这一年,你还有哪事情些想做而没有做? 2014年在我身上发生了两件意义重大的事,一是正月初一宝宝出生,我升级成为了爸爸:二是进入了一家创业公司,成为了技术负责人. 去年 ...

  7. Scala进阶之路-进程控制之执行shell脚本

    Scala进阶之路-进程控制之执行shell脚本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,我这里直接放一个案例. /* @author :yinzhengjie ...

  8. Python之路 - Socket实现远程执行命令

    Python之路 - Socket实现远程执行命令 os模块实现

  9. [ASP.Net] 转 > ASP.NET MVC 大牛之路

    URL: http://www.cnblogs.com/willick/ [ASP.NET MVC 大牛之路]01 - 开篇 [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - ...

随机推荐

  1. 无法在源“”处找到包“entityframework”

    当在程序包管理器控制台安装ef时出现这个 出现这种情况可能是程序包源不对 我的是由于之前项目的源有一个内网平台的,把这个取消勾选就能安装成功了 上图设置路径为工具-NuGet包管理器-管理解决方案的N ...

  2. VsCode中代码折叠快捷键

    ctrl+K  ctrl+[  折叠本级 ctrl+K  ctrl+]  取消折叠本级 ctrl+K  ctrl+0  折叠全部 ctrl+K  ctrl+J  取消折叠全部

  3. windows 安装Git详解

    windows 安装Git详解 一.Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Lin ...

  4. 21、nginx之ngx_http_proxy_module模块

    Nginx 的代理功能是通过 ngx_http_proxy_module 模块来实现的.默认在安装 Nginx 时已经安装了ngx_http_proxy_module模 块,因此可直接使用 ngx_h ...

  5. UI自动化学习笔记- Selenium元素等待(强制等待、显示等待、隐式等待)

    一.元素等待 1. 元素等待 1.1 什么是元素等待 概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程 意思就是:等待指定元素已被加载出来之后,我们才去定位该元素,就不会出现定位失败的现 ...

  6. 其他:Git生成SSH、Git生成本地库、下载远程库代码 命令

    1.安装Git Bash https://git-scm.com/downloads 2.鼠标右键git bash here 3.执行以下命令: ①   cd ~/.ssh/    [如果没有对应的文 ...

  7. Centos下安装最新版本Git

    git是一个分布式版本控制系统 我们在Centos上安装GIT有好几种方式.这里我们用最简单的yum命令方式 一步到位,省了下载编译安装这些繁琐过程. 输入命令: yum install -y git ...

  8. JDBC:MySQL5.x 与 MySQL8.x

    jar包下载地址: https://dev.mysql.com/downloads/connector/j/ 或者 :http://central.maven.org/maven2/mysql/mys ...

  9. spring中如何向一个单例bean中注入非单例bean

    看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...

  10. CF1444D Rectangular Polyline[题解]

    Rectangular Polyline 题目大意 给定 \(h\) 条长度分别为 \(l_1,l_2,--,l_h\) 的水平线段以及 \(v\) 条长度分别为 \(p_1,p_2,--.p_v\) ...