Mono在Full AOT模式下的限制

Mono在Full AOT模式下的限制

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

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

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

  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

时间: 2024-11-03 22:04:11

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

[PHP] swoole在daemonize模式下,chdir失效问题

swoole version: 1.9.6 其实跟swoole的版本无关,因为原代码体系,fpm模式下,在启动的时候,是使用 chdir 函数改变了当前目录的,而其它代码在做类的自动加载的时候,都是写的相对地址,而不是绝对地址. 问题就来了,swoole是多进程的,在daemonize模式下,chdir改变当前目录,在其它进程下是不生效的,所以有时候,不使用daemonize没问题,而使用daemonize会莫名的出现找不到类的情况. 解决方法是,在几个启动的回调里面同时也改变一下目录 $ser

Spark sql 在yarn-cluster模式下找不到表

在hive里建一个数据库test,在数据库里建了一张表user,然后在Spark程序中使用Spark sql读取这张表 "select * form test.user" 当部署模式是spark stand模式和yarn-client模式时,程序可以正常运行,但yarn-cluster模式就报了找不到"test.user"表的错误. 解决办法: spark和hive整合,把hive-site.xml加到spark根目录的conf下,所以,要在提交Spark任务的时候

Play生产模式下java.io.FileNotFoundException那点事

之前”用Scala+Play构建地理数据查询接口”那篇文章里,用到的数据是json格式的文本文件area.json,存放在conf/jsons文件夹下.最开始是放在public/文件夹下,在线上准生产模式下运行: activator dist 得到mosquito-1.0.zip压缩包,解压后: 去/bin目录下运行mosquito脚本报错: java.io.FileNotFoundException 然后就去解压的mosquito-1.0/看发现并没有public文件夹,由此可见public文

检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

我们将ASP.NET程序从IIS6移植到IIS7,可能运行提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 为什么会出现以上错误? 在IIS7的应用程序池有两种模式,一种是“集成模式”,一种是“经典模式”. 经典模式 则是我们以前习惯的IIS 6 的方式. 如果使用集成模式,那么对自定义的httpModules 和 httpHandlers 就要修改配置文件,需要将他们转移到<modules

IIS8集成模式下打开静态资源被aspx处理程序处理,StaticFileModule失效问题分析

问题描述: 打开js,css,jpg之类的静态资源文件触发了asp.net mvc的权限认证,并不是直接返回静态内容 问题分析: StaticFileModule 失效 ,可能是文件权限问题 问题解决: 由于在集成模式下,默认进程标识是应用程序池名称相同的"用户", 如应用程序池为 tom, 那么在进程管理器中,w3wp.exe的用户即为tom 而IIS中要动态的为这种标识设计权限则需要同时给 IIS_IUSERS组  和  IUSR组设置完全控制权限!!! 记得是同时设置. 如果仅给

virtualBox使用nat模式下ssh连接

virtualBox本地虚拟机通过ssh连接一般可通过桥接模式和Nat模式 桥接模式下,共享本地主机网卡,在同一个局域网之下,直接获取Ip地址就可以进行连接了. Nat模式下,获取的Ip与本地主机不是同一个网段,需要做端口转发,才能本地ssh连接虚拟机. 具体设置步骤如下: 1.选择端口转发 2.要设置主机Ip为127.0.0.1,主机端口可以随意设置,不与系统端口冲突则行,子系统端口22,也是ssh默认连接的端口 接下来用ssh连接127.0.0.1,就行

DEBUG模式下, 内存中的变量地址分析

测试函数的模板实现 [cpp] view plain copy /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #define MY_TEMPLATE_H_2016_0123_1226 template<int iArySize> void fnTestDataType() { char szBuf[iArySize] = {'\0'}; unsigned short wT

OpenCV在Debug和Release两种模式下布恩那个同时运行的问题

首先,可以肯定的说,两者是可以随时切换进行运行的,若不能运行,必定是配置出了问题 以Debugx64和Releasex64为例: 在Releasex64模式下,我配置好了各种路径: 于是乎,我切换到Debugx64下,也配置好了对应的路径,但就是运行不成功,总是报错"无法连接外部引用". 百思不得其解,为什么会这样? 其实我是被自己的思维所束缚住了,因为在Release模式下,我只修改了上面那三个路径,所以切换到Debug模式下也只需要修改这几个路径,这就是思维陷进. 最后的答案就是,

linux mini模式下如何制作本地yum源,并用远程工具安装 vim

linux mini模式下如何制作本地yum源,并用远程工具安装 vim 打开虚拟机 启动centos 系统 点右下角的光盘图标 出现连接(或是断开).设置,下拉菜单,选择 "设置" 在虚拟机设置对话框内如图所示 [[email protected] ~]# vim -bash: /usr/bin/vim: 没有那个文件或目录 光盘挂载: 查看系统中所有的挂载信息 [[email protected] ~]# mount /dev/sda3 on / type ext4 (rw) pr