1_03_详解.NET公共语言运行时

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啥也不是

 

posted on 2026-01-23 15:45  张彦山  阅读(1)  评论(0)    收藏  举报