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. Java流程控制:选择结构

    一.选择结构 选择结构用于判断给定的条件,根据判断的结果来控制程序的流程. Java中选择结构的语法主要分为'if...else'语句和'switch...case'语句. Java中选择结构语句在语 ...

  2. Charles 抓取https 包

    1.  Recording Settings中 include 添加 host , port端口为443 2.  SSL Proxying Settings 选中 Enable SSL Proxyin ...

  3. win10使用cmd命令关闭防火墙

    在搜索框内输入cmd,右键选择管理员运行 然后输入: NetSh Advfirewall set allprofiles state off #关闭防火墙 Netsh Advfirewall show ...

  4. 虚拟机测试cobbler,网络安装加载最后出现 dracut:/#

    1.cobbler的几个重要概念: distro:发行版系统容,我理解为镜像来源,提供了kernel 和 initrd 文件以及repo源 profile:kickstart文件,用于定制系统,定制安 ...

  5. 【深入理解Java虚拟机】垃圾回收

    引用计数算法 给对象加一个计数器,引用一次+1,引用时效就-1,当计数器=0时对象就不能再被使用: 实现简单,判定效率高:Java虚拟接没有使用,主要原因是很难解决对象之间循环引用问题: GC算法: ...

  6. 【python+selenium的web自动化】- 元素的常用操作详解(二)

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html ​ 本篇主要内容:1.鼠标 ...

  7. C语言入门--初来乍到

    Hi,我是fish-studio,这是我写的第一篇博客,接下来我会以萌新的角度来与大家一起学习C语言,我也不是什么大佬,在我写的教程中会尽量详细的把我遇到的问题写出来,也会结合一些网上的文章进行编写, ...

  8. JMeter扩展Java请求实现WebRTC本地音视频推流压测脚本

    WebRTC是Web Real-Time Communication缩写,指网页即时通讯,是一个支持Web浏览器进行实时语音或视频对话的API,实现了基于网页的视频会议,比如声网的Agora Web ...

  9. Java视频教程免费分享(网盘直接取)

    Java基础 Java马士兵:链接:https://pan.baidu.com/s/1jJRvxGi密码:v3xb Java刘意:链接:https://pan.baidu.com/s/1kVZQCqr ...

  10. Codeforces Round #537 C. Creative Snap

    题面: 传送门 题目描述: 灭霸想要摧毁复仇者联盟的基地.基地的长度为2的n次方,基地可以看成是一个长度为2的n次方的数组.基地的每一个位置可以由很多个超级英雄,但是一个超级英雄只能站一个位置.灭霸想 ...