<>Mono

跨平台

<>IL

Intermediate Language,中间语言,面向对象的汇编语言

<>工作流

通过C#编译器mcs,将C#编译为IL(中间语言,byte code)
通过Mono运行时中的编译器将IL编译成对应平台的原生码

<>IL三种转译方式

即时编译(Just in time,JIT):程序运行过程中,将CIL的byte code转译为目标平台的原生码。
提前编译(Ahead of time,AOT):程序运行之前,将.exe或.dll文件中的CIL的byte
code部分转译为目标平台的原生码并且存储,程序运行中仍有部分CIL的byte code需要JIT编译。
完全静态编译(Full ahead of time,Full-AOT):程序运行前,将所有源码编译成目标平台的原生码。

<>Unity跨平台的原理

Mono运行时编译器支持将IL代码转为对应平台原生码
IL可以在任何支持CLI,通用语言环境结构)中运行,IL的运行是依托于Mono运行时。

<>IOS不支持jit编译原因

机器码被禁止映射到内存,即封存了内存的可执行权限,变相的封锁了jit编译方式

<>托管代码

c#代码生成的IL编码,由虚拟机的JIT编译执行,其中对象无须手动释放,由GC管理

<>非托管代码

C++/C#中以不安全类型写的代码,虚拟机无法跟踪

<>托管代码剥离

托管代码剥离过程将分析项目中的程序集,以查找和删除未实际使用的代码。分析过程使用一组规则来确定要保留的代码和要丢弃的代码。这些规则将在构建大小(包含太多代码)与风险(删除太多代码)之间进行权衡。Managed
Stripping Level 设置可用于控制删除代码的激进程度。

<>Mono构建

* 构建应用非常快
* 由于Mono的JIT(Just In Time compilation ) 机制, 所以支持更多托管类库
* 支持运行时代码执行
* 必须将代码发布成托管程序集(.dll 文件 , 由mono或者.net 生成 )
* Mono VM在各个平台移植异常麻烦,有几个平台就得移植几个VM(WebGL和UWP这两个平台只支持 IL2CPP)
* Mono版本授权受限,C#很多新特性无法使用
* iOS仍然支持Mono , 但是不再允许Mono(32位)应用提交到Apple Store

<>IL2CPP

* 相比Mono, 代码生成有很大的提高
* 可以调试生成的C ++代码
* 可以启用引擎代码剥离(Engine code stripping)来减少代码的大小
* 程序的运行效率比Mono高,运行速度快
* 多平台移植非常方便
* 相比Mono构建应用慢
* 只支持AOT(Ahead of Time)编译

IL2CPP概括:

* Mono将c#翻译成IL
* IL2CPP得到IL转变为C++代码
* 再由各个平台C++编译器编译成可执行机器码

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信