当前位置:网站首页>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。
边栏推荐
猜你喜欢
随机推荐
Security整各Gateway后配置不生效?
431页14万字政府信息化管理平台解决方案
经典SQL语句大全
单核浏览器和双核浏览器有什么区别,哪个好用?
Embedded Development: Embedded Fundamentals - Software Error Classification
R语言时间序列数据可视化: 使用plot函数可视化单序列时间序列数据、多序列时间序列数据并指定不同时间序列的线条类型(lty)
成都 | 转行软件测试,从零收入到月薪过万,人生迎来新转折...
R语言使用treemap包中的treemap函数可视化treemap图:treemap将分层数据显示为一组嵌套矩形,每一组都用一个矩形表示,该矩形的面积与其值成正比
Make a file upload progress bar
Neo4j Open Source NoSQL Database
【盘古Coder】:高性能函数级程序语言生成模型
How to read excel test data in Go language, easy to learn
FPGA设计超前进位与8421-BCD码全加器
【中标麒麟系统Your trial is EXPIRED and no VALID licens 关闭弹窗】
新博客
R语言时间序列数据提取:使用xts包的last函数提取时间序列中最后面两周的数据(last 2 week)
记录一个相当坑爹的WSL局域网访问问题
自定义组件-behaviors
项目分析(三个小众的嵌入式产品)
新王加冕还是动物乐园?7大顶级蓝筹NFT项目详解









