iOS Mono Full AOT 模式下的限制

IL
IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件, 但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)使用中间语言可以实现平台无关性,既与特定CPU无关;实现.NET框架中语言之间的交互操作,这就是为什么unity3D里面可以c#和js混编。

JIT
即时编译(英语:Just-in-time compilation),又译及时编译、实时编译,动态编译的一种形式,是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,而解释执行的则是一句一句边运行边翻译。JIT狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。

AOT
静态编译、提前编译(Ahead-of-time compilation)

Mono Full AOT 模式的限制
在iOS平台中,Mono是以Full AOT模式运行的,无法使用JIT引擎,Full AOT常见的限制:

1.不支持泛型虚方法。

因为对于泛型代码,Mono通过静态分析以确定要实例化的类型并生成代码,但静态分析无法确定运行时实际调用的方法(C++也因此不支持虚模版函数)。

2.不支持对泛型类的P/Invoke。

3.目前不能使用反射中的Property.SetInfo给非空类型赋值。

4.值类型作为Dictionary的Key时会有问题.

实际上实现了IEquatable的类型都会有此问题,因为Dictionary的默认构造函数会使用EqualityComparer.Default作为比较器,而对于实现了IEquatable的类型,EqualityComparer.Default要通过反射来实例化一个实现了IEqualityComparer的类(可以参考EqualityComparer的实现)。 解决方案是自己实现一个IEqualityComparer,然后使用Dictionary<TKey, TValue>(IEqualityComparer)构造器创建Dictionary实例。之前GC优化篇有提过。

5.由于不允许动态生成代码,不允许使用System.Reflection.Emit,不允许动态创建类型。

由于不允许使用System.Reflection.Emit,无法使用DLR及基于DLR的任何语言。 不要混淆了Reflection.Emit和反射,所有反射的API均可用

–EOF–

王小兵 /
Published under (CC) BY-NC-SA in categories Unity3d  tagged with Unity3d