C# CLI(公共语言基础结构)

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的好处是:

  1. 运行速度快(CPP转原生码比CIL快);
  2. 减少Unity公司的维护成本:Mono VM官方是不支持那么多平台的,所以很多平台的Mono VM都需要Unity自己去制作和维护,而C++编译器是本来各个平台都现成的。

缺点是:

  1. 包体会变大;
  2. 编译速度慢;
  3. 不支持JIT

Mono如何运行CIL

这个部分将会告诉大家,IOS平台究竟有和特别之处,为什么在它上面实现代码热更新那么麻烦。

  1. JIT(Just In Time)模式——在编译的时候,把C#编译成CIL,在运行时,逐条读入,逐条解析翻译成原生码交给CPU再执行;
  2. AOT(Ahead Of Time)模式——在编译成CIL之后,会把CIL再处理一遍,编译成原生码,在运行的时候交给CPU直接执行,Mono下的AOT只会处理部分的CIL,还有一部分CIL采用了JIT的模式;
  3. Full AOT模式——在编译成CIL之后,把所有的CIL编译成原生码,在运行的时候直接执行。

IOS是禁止内存的可执行权限的,不允许在运行过程中创建新的函数等,所以必须要提前编译好所有的代码,更不用说在运行时加载新的代码了。就是说,在IOS下,Mono采用的是Full AOT模式运行CIL。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值