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. Docker的镜像操作

    Docker镜像操作 一.查看镜像 docker images # 查看本地镜像 二.搜索镜像 docker search 镜像名字 docker search centos 三.下载(拉取)镜像 自 ...

  2. Django框架-cookie和session以及中间件

    目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...

  3. Docker-compose封装mysql并初始化数据以及redis

    一.概述 现有一台服务器,需要部署mysql和redis.其中mysql容器,需要在第一次启动时,执行sql文件. redis保持空数据即可. 关于Docker-compose的安装,请参考连接: h ...

  4. pandas的数据筛选之isin和str.contains函数

    筛选是在平时的工作中使用非常频繁的功能,前文介绍了loc和iloc的筛选方法,现在继续介绍一些筛选的方法.   DataFrame列表 以>,<,==,>=,<=来进行选择(& ...

  5. Codeforces Global Round 13

    比赛地址 A(水题) 题目链接 题目: 给出一个\(01\)序列,有2种操作:1.将某个位置取反:2.询问\(01\)序列中第\(k\)大的数 解析: 显然维护1的数目即可 #include<b ...

  6. tcpdump后台抓包并输出给wireshark

    # 先进到/tmp 目录执行,方便Filezila 传输 # 开启抓包 nohup tcpdump -i eth0 -s0 -nnA 'port 22' -w dump22.pcap & [1 ...

  7. WEB容器开启、关闭OPTIONS方法

    发现 请求包随意,响应包信息如下: HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Vary ...

  8. CCF(压缩编码):动态规划+平行四边形优化

    压缩编码 201612-4 一开始看这题还以为是哈夫曼编码的题目,结果是哈夫曼题目的变形. 哈夫曼编码是每次合并任意两堆石子,而这里的题目是合并相邻的两堆石子,而且这里的合并花费是合并两堆石子加上所有 ...

  9. Java 虚拟机详解

    深入理解JVM 1   Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚 ...

  10. 简述Python垃圾回收机制和常量池的验证

    目录 通过代码验证python解释器内部使用了常量池 Python的引入 变量的引入 为什么要有变量 定义变量 常量引入 常量池引入 Python解释器 Python变量存储机制 Python垃圾回收 ...