惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
V
V2EX
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
The Cloudflare Blog
T
Tailwind CSS Blog
H
Help Net Security
腾讯CDC
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
D
DataBreaches.Net
C
Check Point Blog
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

博客园 - 张彦山

03_03_依赖注入多种方式 03_02_服务注册与消费 03_01_服务作用域 02_05_生命周期管理 02_04_依赖注入基本用法 02_03_依赖注入与控制反转 1_05_详解.NET标准与重要工具 1_04_盘点.NET重要组件 1_02_解读.NET开源许可协议 1-01梳理.NET平台发展路线 SQLServer存储过程中break、continue及return 三者的区别: SqlDBX格式化sql语句输出 Mysql转存sql结构和数据文件,不包含视图,使用结构同步视图 启用防火墙要配置入站规则redis端口6379或程序 清除SQL Server数据库日志(ldf文件) 阿里云服务器sqlserver暴力登录密码攻击的处理 清除远程桌面缓存命令 sqlserver修改表结构,阻止保存要求重新创建表的更改 从旧表复制数据到新表
1_03_详解.NET公共语言运行时
张彦山 · 2026-01-23 · via 博客园 - 张彦山

Net核心组件

1、CoreCLR 最核心的 公共语言运行时(C++实现)

Fromwork也有CLR,core是重写了,但基本是一致的

组成部分

中间代码解析:第一个职责就是执行net程序,与c++的原生语言是有很大区别的

特定硬件的机器码,调用操作系统接口,只能在某一个特定平台执行

net包含的不是机器码,是中间代码,不依赖平台的,是跨平台的

1、公共语言运行时会在执行net程序时,解析中间代码,找到对应的模块、类型、成员、方法等,翻译成目标平台的机器码,在运行期间被CLR翻译成了原生程序,在运行时变的  

对应的元数据,

类型信息:支持我们反射,类型安全

GC信息:垃圾回收

异常信息:支持异常处理

中间代码是不能被目标平台所执行的,比如windows是不能直接执行的,由CLR翻译执行

X86,ARM,编译成不同的机器码

1、JRT:Just In Time 即时编译器,变成成平台最高效的代码,不是C#语言的编译器,是中间代码RL的编译器

2、类型安全:也是由CLR保证的,保证对象类型一定正确

c语言,int类型指针,转换成通用指针类型void*==》传递到其它地方,就无法判断到底是int还是long,忘掉原始类型了,如果long转换为int就会产生数据精度丢失,还不触发异常,数据错误

net中,String类型转换成Object,传到其它地方,其它地方还可以通过GetType来判断真实类型到底是啥,如果abc转换成123肯定会触发异常,类型安全

公共语言运行时,为每一个对象保留类型信息,在转换的时候判断是否合法

公共语言运行时管理的对象,就被称之为托管对象,泛型,类型安全的

3、线程管理

每个平台的操作系统都提供了线程机制,可以让计算机充分利用计算机的资源,

但是CLR对原生的线程以及同步对象 进行了包装

我们可以在net里面对net里面的线程对象,用我们封装好的友好的线程管理

不需要操心不同平台的处理机制,而是用CLR处理不同平台的多线程处理

线程有两种:1、由公共语言运行时管理的线程,叫做托管线程,是假线程,net里面的线程,不是真线程,虚拟线程,托管代码RL需要在托管线程里面运行,

配合垃圾回收机制

真实的物理线程由公共语言运行时翻译,翻译之后调用真正的线程

net开发的时候都是托管线程,并不是真正的线程

GC垃圾回收,公共语言运行时提供的,可以在不需要的时候自动释放

有些语言没有垃圾回收机制,那么开发者需要手动确定在何时释放分配的资源

太早,太晚都有问题

GC会自动监控无效的对象执行销毁操作,内存回收整理

只能回收通过CLR分配的托管对象,非托管代码中分配的非托管资源,仍然需要开发者手动释放

什么叫非托管?比如打开一个文件==》必须经过系统API===》文件句柄

文件对象是c#的,文件句柄是属于系统的,属于非托管的,不在当前类

需要手动释放

net也对一些常用的非托管资源使用了托管的包装代码

虽然我们关闭了,我们并不是使用系统的API,而是使用的net封装好托管的方法,帮我们关闭文件句柄

最基础最底层的

没有CLR,net啥也不是