【Mono在Full AOT模式下的限制】

  调试时遇到一个Mono运行时异常:

ExecutionEngineException: Attempting to JIT compile method '...' while running with --aot-only.

  最后发现原因是使用了泛型接口,导致Mono需要JIT编译,但在iOS平台中,Mono是以Full AOT模式运行的,无法使用JIT引擎,于是引发了这个异常。

  JIT的涵意是,实时生成NativeCode。

  Mono的AOT和.NET的Ngen一样,都是通过提前编译来减少JIT的工作,但默认情况下AOT并不编译所有IL代码,而是在优化和JIT之间取得一个平衡。由于iOS平台禁止JIT编译,于是Mono在iOS上需要Full AOT编译和运行。即预先对程序集中的所有IL代码进行AOT编译生成一个本地代码映像,然后在运行时直接加载这个映像而不再使用JIT引擎。目前由于技术或实现上的原因在使用Full AOT时有一些限制,具体可以参考MonoTouch的文档,这里提几条常见的:

  • 不支持泛型虚方法,因为对于泛型代码,Mono通过静态分析以确定要实例化的类型并生成代码,但静态分析无法确定运行时实际调用的方法(C++也因此不支持虚模版函数)。
  • 不支持对泛型类的P/Invoke。
  • 目前不能使用反射中的Property.SetInfo给非空类型赋值。
  • 值类型作为Dictionary的Key时会有问题,实际上实现了IEquatable<T>的类型都会有此问题,因为Dictionary的默认构造函数会使用EqualityComparer<TKey>.Default作为比较器,而对于实现了IEquatable<T>的类型,EqualityComparer<TKey>.Default要通过反射来实例化一个实现了IEqualityComparer<TKey>的类(可以参考EqualityComparer<T>的实现)。 解决方案是自己实现一个IEqualityComparer<TKey>,然后使用Dictionary<TKey, TValue>(IEqualityComparer<TKey>)构造器创建Dictionary实例。
  • 由于不允许动态生成代码,不允许使用System.Reflection.Emit,不允许动态创建类型。
  • 由于不允许使用System.Reflection.Emit,无法使用DLR及基于DLR的任何语言。
  • 不要混淆了Reflection.Emit和反射,所有反射的API均可用。

- See more at: http://ravenw.com/blog/2011/11/08/limitations-of-mono-with-full-aot/#sthash.Wi5sL8EL.dpuf

Mono在Full AOT模式下的限制的更多相关文章

  1. ASM:《X86汇编语言-从实模式到保护模式》越计卷:实模式下对DMA和Sound Blaster声卡的控制

    说实话越计卷作者用了16页(我还是删过的),来讲怎么控制声卡,其实真正归纳起来就那么几点. ★PART1:直接存储访问 1. 总线控制设备(bus master) 在硬件技术不发达的早期,处理器是最重 ...

  2. 微软Azure 经典模式下创建内部负载均衡(ILB)

    微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...

  3. 苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转

    昨天下午,测试提了一个bug,问题是:在苹果手机Safari无痕浏览模式下系统登录成功但是页面不跳转. 思前想后找了半天没思路,后来经过同事的点拨,说可能是禁用了cookie之类的,反正我也没思路就顺 ...

  4. win10 下visual studio 2015 在调试模式下不能跟踪源文件

    win10 下visual studio 2015 在调试模式下不能跟踪源文件,只要一调试就会关闭(隐藏)打开的文档,非常不方便.经过一番折腾,发现是配置的问题. 如果安装多个版本的VS,请删除对应版 ...

  5. 转:IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字

    IE兼容模式下 SCRIPT1028: 缺少标识符.字符串或数字例如下面一段代码 var a = {    x: 1,    y: 2,};alert(a.x);如果在IE的兼容性视图(IE7文档模式 ...

  6. 【配置】检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)。

      ×   检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式). 我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 5 ...

  7. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码

    在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...

  8. MVC开发模式下的用户角色权限控制

    前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...

  9. TreeView 使用方法:(在View.Details模式下)

    1.建立TreeView的標題         2.建立TreeView的Item         3.在TreeView的Item中的建立SubItem                  如果將各部 ...

随机推荐

  1. python模块--time模块

    1.时间戳 import time #------->> 时间戳 print(time.time()) 1525418832.2835853 2.结构化时间 #------->> ...

  2. bzoj 4816 [Sdoi2017]数字表格——反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4816 \( ans=\prod\limits_{d=1}^{n}f[d]^{\sum\lim ...

  3. Android 从上层到底层-----kernel层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 1.在dts文件中增加 led 设备 path:kernel/arch ...

  4. 最近项目和java对接,涉及到java的DESede加解密算法

    google后找到这个作者的一篇博客,搬过来用 http://hersface.com/page/17.html <?php class DESede{ /** * 加密 * @param $d ...

  5. wdlinux中apache配置反向代理模块

    想要在.htaccess中开启反向代理功能都不行[apache中没有mod_proxy模块] .htaccess 文件内容如下 RewriteEngine On RewriteBase / Rewri ...

  6. 封装与继承(PHP学习)

    什么是封装? 答:封装时不知道内部构造,对外部只展现功能的这种行为.例如:收音机,你不知道收音机内部的构造,但是你知道收音机是能用来听广播的. 在PHP中,封装是,不对外公布,属性和方法,这些属性和方 ...

  7. Django 组件-ModelForm

    ModelForm 组件功能就是把model和form组合起来. 首先导入ModelForm from django.forms import ModelForm 在视图函数中,定义一个类,比如就叫S ...

  8. JavaScript Promise启示录--(转)

    本博文转至:http://www.csdn.net/article/2014-05-28/2819979-JavaScript-Promise [编者按]JavaScript是一种基于对象和事件驱动并 ...

  9. 数据结构与算法JavaScript描述——队列

    注:澄清一个bug: /** * 删除队首的元素: */ function dequeue(){ return this.dataStore.shift(); } 应该有return:   队列是一种 ...

  10. 报错:Can't find a source file at "xxxxx“Locate the file or edit the source lookup path to include its location.

    调试问题: Can't find a source file at "/tmp/TI_MKLIB6sLCzz/SRC/exit.c" Locate the file or edit ...