当前位置:网站首页>C# CLI(公共语言基础结构)
C# CLI(公共语言基础结构)
2022-07-29 18:45:00 【地狱火堡垒】
CLI定义
C#生成的不是机器码,而是中间语言——Common Intermediate Language(CIL)。在执行时在会被转换为机器码
注意区分CLI和CIL,充分理解含义
当然,代码想要执行,转换为机器码是不够的。还需要一个负责管理C#程序执行的代理,也就是虚拟执行系统(Virtual Execution System),又称“运行时”。不仅负责加载和运行程序,还负责安全保障,垃圾回收等额外功能
CLI标准包含以下规范:
虚拟执行系统(VE)——运行时
CIL——通用中间语言
公共类型系统——Common Type System (CTS)
公共语言规范——Common Language Specification (CLS)
元数据(Metadata)
框架(Framework)
运行时
“运行时”在将CIL代码转换为机器码并执行它之后,他仍在继续管理着代码的执行。在“运行时”这个代理环境下执行的代码称为托管代码,执行过程叫托管执行。数据所需的内存是由“运行时”自动分配和回收的
垃圾回收
.NET垃圾回收器,在每次执行垃圾回收期间会将清理之后的对象压缩在一起,这能使新对象更快的实例化,因为不需要搜索新的分配空间。另外如果计算机内存剩余大量空间,垃圾回收器很少运行——这就是为什么Unity开发时最好自己实现一个缓存池,而不是直接Destroy。
类型安全
“运行时”会检查类型之间的转换,以此来防止程序员造成缓冲区溢出。
还能规定什么类能访问特定方法,例如private只能由包容她的类型访问(反射如果有相应权限能够绕过封装和修饰符)
应用程序域
应用程序域(App Domain)位于程序和操作系统之间的虚拟进程或者应用程序。应用程序域的行为类似于一个操作系统进程,他们之间是相互隔离的,相互通信需要分布式通信模式,而且静态数据不共享。
之所以这样做是因为进程十分宝贵,我们能在一个进程内运行多个应用程序域,避免额外花销。
Unity引擎是如何做到跨平台运行的
程序集
一个.Net程序由一个或者多个程序集组成,程序集可以是库,也可以是应用程序。.Net中,库项目导出的文件格式为.dll,应用程序导出后的文件格式为.exe。
虚拟机——Mono
大家在Unity项目中都见过Mono这个词,MonoDeveloper,MonoBehavior等,那Mono到底是什么?
Mono是一个基于CLR的开源项目,允许引擎和用户的托管代码运行在每一个目标平台上。而CLR全称为通用语言运行平台(Common Language Runtime),是微软的.Net虚拟机。
它其中两个主要作用是:1,编译——运行前把C#编译为CIL;2,运行——在运行的时把CIL转换成各平台的原生码。
这些是Mono支持的平台:Android,Apple iOS,Linux,Microsoft Windows,Nintendo Wii,Sony PlayStation 4
IL2CPP
其实Unity后来出了另外一个方案:IL2PP。
它会在项目转成CIL之后,再把CIL转成CCPP,然后在运行的时候,把CPP加载进来,由各个平台的IL2PP VM转换成原生码。

IL2CPP的好处是:
- 运行速度快(CPP转原生码比CIL快);
- 减少Unity公司的维护成本:Mono VM官方是不支持那么多平台的,所以很多平台的Mono VM都需要Unity自己去制作和维护,而C++编译器是本来各个平台都现成的。
缺点是:
- 包体会变大;
- 编译速度慢;
- 不支持JIT
Mono如何运行CIL
这个部分将会告诉大家,IOS平台究竟有和特别之处,为什么在它上面实现代码热更新那么麻烦。
- JIT(Just In Time)模式——在编译的时候,把C#编译成CIL,在运行时,逐条读入,逐条解析翻译成原生码交给CPU再执行;
- AOT(Ahead Of Time)模式——在编译成CIL之后,会把CIL再处理一遍,编译成原生码,在运行的时候交给CPU直接执行,Mono下的AOT只会处理部分的CIL,还有一部分CIL采用了JIT的模式;
- Full AOT模式——在编译成CIL之后,把所有的CIL编译成原生码,在运行的时候直接执行。
IOS是禁止内存的可执行权限的,不允许在运行过程中创建新的函数等,所以必须要提前编译好所有的代码,更不用说在运行时加载新的代码了。就是说,在IOS下,Mono采用的是Full AOT模式运行CIL。
边栏推荐
- Chengdu | Changed to software testing, from zero income to over 10,000 monthly salary, a new turning point in life...
- c语言 || 杂
- 智能合约安全——重入漏洞
- 函数的声明与作用域
- Postgresql中的pg_memory_barrier_impl和C的volatile
- Idea工具的使用
- 593. 有效的正方形 改善丑陋的代码
- 高速无源链路阻抗匹配套路
- pkg_resources.DistributionNotFound: The 'pip==1.4' distribution was not found and is required
- 2022/7/27
猜你喜欢
随机推荐
String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类
Idea工具的使用
小程序使用npm包
不堆概念、换个角度聊多线程并发编程
h264和h265视频流SDP描述详解
在宇宙中心五道口上班,是怎样一种体验
五种常见IO模型
for key in object 遍历对象遇到的问题
实现一个可调节大小的 Switch 开关
新西藏,在云上!
Working for 9 years!
Small programs use npm packages
pytorch构建YOLOV7网络结构
U盘拔出时总是提示有程序正在使用?
For key in object traversal of objects encountered problems
R语言时间序列数据提取:使用xts包的first函数提取时间序列中最前面两周的数据(first 2 week)
Custom Components -behaviors
MySQL 中的反斜杠 \\,我上当了
如何实时计算日累计逐单资金流
面试突击:为什么 TCP 需要 3 次握手?







