CLR 简介

  运行时(Runtime Environment,简称Runtime ),是指那些支持在特定的平台上,用于运行特定编程语言编写的软件的库和程序集,它一般要处理软件和操作系统之间的接口细节。例如,系统调用、程序的启动和终止、内存管理等。 运行时分3种:纯静态环境(如Fortran)、基于堆栈环境(如C、C++、Pascal)、纯动态环境(如SmallTak、Java)。

  CLR(Common Language Runtime),处于 .NET Framework 的最底层,它是 .NET Framework 的核心。CLR 是一个软件引擎,提供加载应用程序、程序编译、错误检查、安全许可认证、线程管理、远程处理、执行、清空内存等核心服务。 CLR 是属于纯动态运行时的一种,它的主要组成部分是虚拟执行引擎 VEE(Vitual Execution Enging)。

CLR 版本
  CLR 是.NET Framework 的子集,但是两者的版本策略不同。截止2019年,微软发布了4个版本的CLR,对应关系如下。

使用 ASP.NET Web Form 开发的应用程序,部署到IIS服务器时,不同的CLR版本需要选择不同的托管管道模式。

 

CLR 构成

CLR主要由以下11个功能器件组成。

(1)类加载器(Class Loader):将应用程序的汇编加载到内存中。汇编包括微软中间语言(Microsoft Intermediate Language,简称MSIL)代码、描述应用程序中组件的元数据(类和类的布局描述),以及其他应用程序所需的组件。
(2)即时编译器(Just-In-Time,简称JIT):负责将MSIL翻译成本机执行代码。
(3)代码管理器(Code Manager):管理代码的执行。
(4)垃圾回收器(Garbage Collection):负责整个.NET运行时托管代码的内存分配与释放任务,它通过一定的优化算法选择收集对象和时间,并进行自动的垃圾收集。
(5)安全引擎(Security Engine):提供基于认证的安全机制,如用户身份。
(6)调试引擎(Debugger):使开发者能调试和跟踪应用程序代码。
(7)类型检查器(Type Checker):检查并禁止非安全的类型转换以及未初始化的变量的使用。
(8)异常管理器(Exception Manager):提供结构化的异常处理,与Windows结构化异常处理机制(SHE)集成,改进了错误报告。
(9)线程支持(Thread Support):提供了多线程编程的类和接口。
(10)COM列集器(COM Marshaler):处理与COM之间的配置。
(11).NET 基础类库(BCL):集成具有支持.NET Framework 类库运行时的代码。

CLR 工作原理

编译器(Windows平台上有3个不同的JIT编译器)
1、JIT -- 标准编译器。运行时默认使用的JIT编译器。代码高度优化,资源开销大,它要求计算机具有足够的内存来高速缓存编译后的代码,以便重复利用。如果没有足够的内存来高速缓存编译后代码,就需要反复调用JIT,由于优化技术需要花时间,这样就大大降低了编译的速度。
2、EconoJIT -- 经济编译器。它不是执行优化技术的编译器。代码不能高速缓存,但可以把MSIL快速转换成托管的原始代码,编译速度快。
3、PreJIT -- 类似传统的编译器。实现将应用程序首次安装到计算机时,就把整个应用程序转换为本机代码。

编译过程
(1)编译器首先将各类.NET 上支持的语言(C#、VB.NET、VC++等)编写的源代码编译托管的中间语言(MSIL)代码,不是机器码。这个MSIL就构成可移植执行的 .exe文件(Portable Executable,检查PE)。在编译器将源代码编译成MSIL的同时,元数据引擎也产生元数据信息,这些代码也可和其他语言编译的代码链接为一个EXE或DLL文件(通过链接器实现)。
(2)由于本地的CPU不能直接执行MSIL指令。当执行应用程序时,首先类加载器将应用程序的汇编(MSIL代码和元数据)加载到内存中,然后使用其中的元数据加载任何应用程序所需要的组件支持的汇编并进行类型安全和版本检查。例如:它可能加载一个桌面应用程序所需要的图形用户接口(GUI)控制的汇编等。
(3)CLR 并不是将应用程序的所有MSIL的代码都翻译成CPU指令代码,仅当用户需要运行一个托管的应用程序时,操作系统装载器才加载 CLR,这时CLR 才开始翻译该应用的MSIL代码。当然,如果开发人员希望在应用程序首次安装到计算机中时就全部从MSIL转变为本机代码,那么可以使用 PreJIT 编译器实现,PreJIT自动把MSIL转换本机代码。
(4)JIT编译器和其他大多数编译器是不用的。JIT编译器只执行编译这个过程,而在其他编译器(C和C++)中要经过编译和链接两个阶段。也就是说,.NET下的源程序(C#等)并不被编译成目标文件(.obj),而是直接生成可执行文件(.exe)或动态链接库(.dll)。在.NET下,编译器不需要包含链接器。

技术栈

1、.NET:C#、.NET5、.NET6、.NET Core、MVC、ASP.NET Core、Web API、RESTful API

2、jQuery、Vue.js、Bootstrap

3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、SequoiaDB 、

Redis、MongoDB、ElasticSearch、TiDB

4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表

5、架构:领域驱动设计 DDD、ABP

6、环境:跨平台、Linux、Windows、MaxOS、IIS、Nginx

7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、

Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、

mpvue、Smobiler

其他:

  • 云原生、CI/CD、DevOps、微服务、Docker、K8S
  • Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件
  • RPC、ELK
  • .NET + Docker + jenkins + Github + Harbor + K8S
  • Python、Go

.NET6 平台系列3 .NET CLR 详解的更多相关文章

  1. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  2. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

  3. kettle的下载、安装和初步使用(Ubuntu 16.04平台下)(图文详解)

    不多说,直接上干货! 能够看我这篇博客的博友们,想必是已经具备一定基础了. 扩展博客 kettle的下载.安装和初步使用(windows平台下)(图文详解) kettle的下载 žKettle可以在h ...

  4. .NET6 平台系列4 .NET开源之路

    系列目录     [已更新最新开发文章,点击查看详细] .NET平台是微软于2000年推出的Windows操作系统的应用软件开发框架,发展至今形成巨大的技术栈,涉及多语言(支持C#.F#.VB.NET ...

  5. Signalr系列之虚拟目录详解与应用中的CDN加速实战

    目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 前段时间一直有人问我 在用SignalR 2.0开发客服系统[系列1:实现群发通讯]这篇文章中的"/Si ...

  6. 转载爱哥自定义View系列--文字详解

    FontMetrics FontMetrics意为字体测量,这么一说大家是不是瞬间感受到了这玩意的重要性?那这东西有什么用呢?我们通过源码追踪进去可以看到FontMetrics其实是Paint的一个内 ...

  7. 转载爱哥自定义View系列--Paint详解

    上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilt ...

  8. kubernetes系列07—Pod控制器详解

    本文收录在容器技术学习系列文章总目录 1.Pod控制器 1.1 介绍 Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无 ...

  9. Cobaltstrike系列教程(三)-beacon详解

    0x000--前文 Cobaltstrike系列教程(一)-简介与安装 Cobaltstrike系列教程(二)-Listner与Payload生成 heatlevel 0x001-Beacon详解 1 ...

随机推荐

  1. easyPOI基本用法

    参考网址:http://www.wupaas.com/ 1.Excel文件的导入导出 项目源码:后台:https://github.com/zhongyushi-git/easypoi-demo-ad ...

  2. DRF的orm多表关系补充及serializer子序列化

    目录 一.控制多表关系的字段属性 1.如何建立基表 2.断开连表关系 3.四种级联关系 二.子序列化 一.控制多表关系的字段属性 1.如何建立基表 要在基表中配置Meta,设置abstract=Tru ...

  3. 共享内存与存储映射(mmap)

    [前言]对这两个理解还是不够深刻,写一篇博客来记录一下. 首先关于共享内存的链接:共享内存.里面包含了创建共享内存区域的函数,以及两个进程怎么挂载共享内存通信,分离.释放共享内存. 共享内存的好处就是 ...

  4. Layui 源码浅读(模块加载原理)

    经典开场 // Layui ;! function (win) { var Lay = function () { this.v = '2.5.5'; }; win.layui = new Lay() ...

  5. 007-变量的作用域和LED点阵

    变量 一.局部变量和全局变量 局部变量:函数内申明的变量,只在函数内有效. 全局变量:函数外部申明的变量.一个源程序文件有一个或者多个函数,全局变量对他们都起作用. 备注:全局变量有副作用,降低了函数 ...

  6. POJ-3259(最短路+Bellman-Ford算法判负圈)

    Wormholes POJ-3259 这题是最短路问题中判断是否存在负圈的模板题. 判断负圈的一个关键就是理解:如果在图中不存在从s可达的负圈,最短路径不会经过一个顶点两次.while循环最多执行v- ...

  7. 《从零开始TypeScript》系列 - 基础数据类型

    TypeScript 是 JavaScript 的超集,这里我们只讨论两者中的不同的部分,或者需要注意的部分 数组 Array:在TypeScript中,有两种方式来定义一个数组: 在元素类型后面接上 ...

  8. 【python+selenium的web自动化】- 控制浏览器的常用操作

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 前言 ​ 本文主要介绍se ...

  9. go beego框架与python实现数据交互

    目标:将go中一个二维数组传到pythone中处理并返回.难点在于数据格式的转换. go代码如下: package main import ( "os/exec" "sy ...

  10. Python之内存泄漏和内存溢出

    预习知识:python之MRO和垃圾回收机制 一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题.对于一个用 python 实现的,长期运行的后台 ...