Mono
Mono是一个开源项目。基于通用语言架构和C#的 ECMA标准,提供了.NET的另一种实现。并且具备了跨平台的能力,能在Windws、Mac、Linux甚至一些游戏平台上运行。
查看unity的Mono版本
Debug.Log(Application.unityVersion);
Type type = Type.GetType("Mono.Runtime");
if (type != null)
{
MethodInfo displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
if (displayName != null) Debug.Log(displayName.Invoke(null, null));
}
Mono的组成
-
C#编译器 mcs
编译器的作用是把c#源码编译成通用中间语言(MCIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,终可以被CPU直接计算的机器码(NativeCode)。 -
Mono运行时
提供了一个即时编译器(JIT),以及一个提前编译器(AOT),同时还有类库加载器,垃圾回收和线程系统等。在非Window平台需要Mono运行时来编译。 -
基础类库
与微软的.Net框架兼容 -
Mono类库
提供了很多超越基础类库,超越.Net框架的类。
Mono运行时
mcs的作用是将c#源码编译为ECMA CIL的字节码,之后则需要Mono运行时的编译器,将字节码转译为机器码。Mono运行时提供了3种转译方式:
- 即时编译(JIT)
在运行过程中,将CIL的字节码转为目标平台的原生码
1.运行当中 2.生成的是新代码 3.还得运行 - 提前编译(AOT)
在运行前,将CIL的字节码转为目标平台的原生码并储存起来,但还是有一部分转译需要用到JIT - 完全静态编译(Full AOT)
完全杜绝JIT,IOS平台
IOS不能热更代码原因:
原因:IOS封了内存(或堆)的可执行权限,相当于变相的封锁了JIT的这种编译方式。
CIL是什么
CIL是指令集。基于堆栈,而非通过CPU的寄存器来操作。和其具体的CPU架构无关。
CIL语言其实是运行在虚拟机中,具体到Unity 3D游戏引擎也就是Mono的 运行时。