我试图通过MonoTouch中的Debug|iPhone选项在iOS设备上运行我们的应用程序。然而,我们很快就遇到了一个问题。应用程序崩溃,出现以下异常
Attempting to JIT compile method "System.Linq.Enumerable:<FirstOfDefault`1>m_13<int> (int)" while running with aot-only.
现在我明白这个问题来自于JIT的通用部分,这在实际的iOS设备上是不允许的。但我不知道如何修复它。
下面是它崩溃的代码:int nextTag = (from tag in _cellControllers.Keys
where tag > currentTag
select tag).FirstOrDefault();
_cellControllers是一个
Dictionary <int, UITableViewSource>
如何防止这个错误的发生?
问题是将值类型作为字典中的键,如下所述。将字典更改为不使用值类型作为键可能会使这种情况有效(不幸的是,在某些情况下,LINQ将自己使用字典,在这种情况下,它将需要重写查询)。
我们正在努力修复这些问题,同时使用LINQ,所以我也建议提交一个bug与一个可编译的测试用例,这样我们可以确保你的案例在未来的工作。
您可能遇到了AOT限制(就像这个),AOT编译器无法提前正确地确定要编译的类型,以确保代码可以在运行时工作。
如何防止这个错误的发生?
解决方案取决于被击中的确切限制。LINQ查询会生成大量的IL代码,所以对于开发人员(或apt编译器)来说,生成的代码并不总是显而易见的。这使得解决这个问题有点困难。
为了找到这些问题的根源,我们需要大量的信息,所以在http://bugzilla.xamarin.com上填写一个bug报告会更好。例如
最重要的部分是设备日志,您可以通过在终端窗口中运行以下命令获得:
/Developer/MonoTouch/usr/bin/mtouch --logdev
然后执行/崩溃您的应用程序,并将输出复制粘贴到终端上的bug报告中(或将其作为附件添加)。