.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. 『心善渊』Selenium3.0基础 — 7、XPath轴定位详解

    目录 1.XPath轴定位介绍 2.位置路径表达式概念 3.步的路径表达式范例 4.练习 使用XPath轴方式,可根据文档中元素的相对位置,来进行元素的定位.例如:先找到一个相对好定位的元素,在根据与 ...

  2. 手摸手,带你用Beego撸商城系列二(登录篇)

    完整项目地址: go-shop-b2c 系列文章: 手摸手,带你用 Beego撸商城 系列一(基础篇) 手摸手,带你用 Beego撸商城 系列二(登录篇) 手摸手,带你用 Beego撸商城 系列三(系 ...

  3. 用jquery通过点击事件把下拉列表币种的值传给文本框1,再通过文本框1的币种名称用if转化为币别传值给文本框2保存

    <script src="https://cdn.staticfile.org/jquery/2.2.4/jquery.min.js"></script>& ...

  4. Android Studio使用Gradle引入第三方库文件

    原文链接:https://blog.csdn.net/qiutiandepaomo/article/details/81538937 使用AndroidStudio开发Android应用的时候,会经常 ...

  5. Mongo3基础操作

    由于3.X的文档是在3.X当前最新版本前记录,所以这里列出一些常用的操作,比如建立库,删除库,等一些格式,然后在描述开启远程和创建用户的一些区别,以及讲解2.X和3.X配置文件区别. 1. Mongo ...

  6. Nacos配置中心交互模型是 push 还是 pull ?你应该这么回答

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富- 对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服 ...

  7. [网络编程]mqtt概念&数据包

    目录 前言 1. MQTT 简介 2. MQTT 通信模型 2.1 MQTT 协议 2.2 MQTT 协议中的订阅&主题&会话 2.3 MQTT 协议中的方法 3. MQTT 协议数据 ...

  8. 资源:docker-compose下载路径

    docker-compose下载路径: compose所有版本:https://github.com/docker/compose/releases

  9. mysql某建表语句

    CREATE TABLE `product_info`( `product_id` VARCHAR(32) NOT NULL COMMENT '主键', `product_name` VARCHAR( ...

  10. PHP设计模式之策略模式(转)

      介绍 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 封装:把行为用接口封装起来,我们可以把那些经常变化的部分,从当前的类中单独取出来,用接 ...