[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 新增的一种执行模型。

1基于 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),只是叫法不同。它是处理器能够理解并直接执行的字节码指令。所有其他代码必须翻译或转换为机器码才能在计算机上运行。

2基于 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 编译器编译,启动效率更高。

3小结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可爱的穆里尼奥,可爱的切尔西!

这是刚刚结束的欧冠比赛结果:我所关注的切尔西对巴萨的比赛,以2:2的赛果结束,无论如何,是很满意的.OK,我可经先补会觉了,待白昼到来之时,再聊几句。

美国警察开特斯拉追疑犯,时速飙到193公里,然后发现没电了...

全世界只有3.14 % 的人关注了青少年数学之旅晚上11点,时速一度高达193公里!美国警察在湾区的一条州际公路上,对嫌犯实施追捕。与往常不同的是,这位警员驾驶的是一辆特斯拉Model S,0到60英里(96公里&#xf…

苹果cms主动推送php,飞飞cms、海洋cms、苹果cms、maccms百度主动实时自动推送代码...

飞飞cms、海洋cms、苹果cms、maccms百度主动实时自动推送代码该代码适用于所有网站,不限于苹果cms、飞飞海洋等。其他帝国cms、wordpress等等都可以使用。代码如下:(function(){var bp document.createElement(script);var curProtocol window.locatio…

梅原对justin wang 真人版

转载于:https://www.cnblogs.com/oiramario/archive/2008/07/15/1243337.html

Hello Blazor:(6)你必须踩过这5个坑,才算学会部署Blazor WebAssembly到静态网站

上次的文章中,我们介绍了Blazor WebAssembly可以部署到静态文件服务器,而每个Github账户都可以使用GitHub Pages功能开一个自己的静态网站。那么,不用花钱购买服务器,就可以将Blazor WebAssembly项目部署到GitHub Pages作为demo展…

XML--使用XML来将字符串分隔成行数据

DECLARE xml XML SET xmlCAST(REPLACE(<ROOT><X>AA,AB,AC,AD</X></ROOT>,,,</X><X>) AS XML)SELECT T.C.value(.,varchar(20)) AS Result FROM xml.nodes(/ROOT/X) T(C) 取前几条记录&#xff0c;如10,102,10254,103265,541,2154,41,156中…

关于所谓的穷人富人幸福论

穷人把自己的失意与落魄藏在自己的内心深处&#xff0c;把拿到手上的一点点蝇头小利挂在嘴边。穷人展示出来的他们的笑脸&#xff0c;却掩饰不住他们内心伤痛的事实。富人把自己的得意与成功完全抛在一边&#xff0c;然后玩自虐似的把自己的一点点小伤痛挂在嘴边。外人只能看到…

做题不如巧做题,初中数学题型解题技巧都在这!

▲ 点击查看今天&#xff0c;小天就为大家整理了初中数学各类题型解题技巧。我们一起往下看哦。1.数形结合思想根据数学问题的条件和结论之间的内在联系&#xff0c;既分析其代数含义&#xff0c;又揭示其几何意义&#xff1b;使数量关系和图形巧妙和谐地结合起来&#xff0c…

php 获取对象所有成员变量,PHP成员变量获取对比

有如下4个代码示例&#xff0c;你认为他们创建对象&#xff0c;并获得成员变量的速度排序是怎样的&#xff1f;1&#xff1a;将成员变量设置为public&#xff0c;通过赋值操作给成员变量赋值&#xff0c;直接获取变量class Foo { public $id; } $data new Foo; $data->id…

32位应用程序单个进程最大占用内存是4GB

32位应用程序单个进程最大占用内存是4GB左右&#xff0c;这个问题是因为需要测试大数据里才能体现出来的问题&#xff0c;所以反反复复花了一周多的时间来搞定它&#xff0c;希望大家在对它有一个印象。64位的应用程序的时候就不会有这个限制。所以这种情况下请编译成64位的程序…

【Blog.Core开源】快速升级.NET 6.0

BCVP只要贡献&#xff0c;就不分大小&#xff0c;每个人都是这个时代最璀璨的星&#xff01;一个以开源项目主导的社区组织。《Blog.Core》开源项目已经3年&#xff0c;期间收获了很多很多&#xff0c;同时也收到了很多小伙伴的支持和鼓励&#xff0c;才使得我有足够的心力从2.…

全网爆红!全新洗脑神曲:程序员Disco

作曲 : 宝石gem作词 : 宝石gem作词改编&#xff1a;云信刘亦菲产品&#xff1a;这个需求明天就得实现开发&#xff1a;至少2周产品&#xff1a;就3天&#xff0c;是不是干不了开发&#xff1a;开玩笑&#xff0c;加班也要1周多产品&#xff1a;4天&#xff0c;有啥困难我帮你跟…

SiteMapCreator 发布 (Open Source)

Site Map Creator (Open Source) Introduction Site Map是asp.net里面很方便的一个站点导航的控键。使用它&#xff0c;只需要简单的配置一下xml文件&#xff0c;就能够控制页面流。但是用手去编写SitMap的xml文件实在太麻烦了&#xff0c;因此我写了这个小软件&#xff0c;并…

eclipse默认编码为GBK,修改为UTF8的方法

2019独角兽企业重金招聘Python工程师标准>>> eclipse 默认编码居然是GBK&#xff0c;js文件默认编码是ISO-....怎么可以这样呢&#xff1f;都修改成UTF8的方法&#xff1a;1、windows->Preferences...打开"首选项"对话框&#xff0c;左侧导航树&#x…

php中页面平滑回到顶部代码,原生JS实现平滑回到顶部组件_javascript技巧

返回顶部组件是一种极其常见的网页功能&#xff0c;需求简单&#xff1a;页面滚动一定距离后&#xff0c;显示返回顶部的按钮&#xff0c;点击该按钮可以将滚动条滚回至页面开始的位置。实现思路也很容易&#xff0c;只要改变document.documentElement.scrollTop或document.bod…

在Word XP中也能插入国际音标、拼音

在wps2000 中可以轻松地插入国际音标和汉语拼音&#xff0c;但是利用它输入的汉语拼音和国际音标只能够在WPS2000中打印输入&#xff0c;无法到别的软件中进行再编辑。同时尽管Word XP具有符号插入的功能&#xff0c;但是无论如何都找不到国际音标和汉语拼音&#xff0c;不过&a…

数学有多震撼?!我真的没有在开车!

让我们来欣赏一下日本高校欧派函数&#xff08;おっぱい関数&#xff09;对抗大赛中的作品吧。埼玉大学&#xff08;理学部&#xff09;其中 明治大学広島大学&#xff08;理学部&#xff09;東京農業大学其中 是一个可调常数&#xff0c;下图中p3。文教大学京都大学其中首都大…

一些微服务拆分的浅见

大家好&#xff0c;我是Z哥。不管是十几年前 SOA 的流行&#xff0c;还是 7、8 年前微服务的大行其道&#xff0c;还是如今云原生的展露锋芒&#xff0c;背后都离不开一件事&#xff0c;程序拆分或者说服务拆分。否则&#xff0c;一个单体应用&#xff0c;以上的这些技术潮流好…

centos 6.0安装杀毒软件clamAV 0.98

1、查看系统版本[rootlocal]# lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarchDistributor ID: CentOSDescription: CentOS release 6.4 (…

php post api json数据,php – REST API:请求身份为JSON或纯POST数据?

POST&#xff0c;PUT&#xff0c;GET都是HTTP动词&#xff0c;并且本身并不表示传输数据的格式&#xff0c;因此没有POST格式。这意味着您可以按照您选择的任何方式对数据进行编码。现在&#xff0c;你决定采用什么样的格式&#xff0c;真的应该是一个API通常被使用的问题。如果…