使用LINQ的设备上的Monotouch JIT错误

时间:2011-12-13 12:37:40

标签: iphone linq xamarin.ios jit aot

我试图通过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>

如何防止此错误发生?

2 个答案:

答案 0 :(得分:5)

问题在于将值类型作为字典中的键,如文档here所述。将字典更改为没有值类型作为键可能会使这种情况起作用(遗憾的是,在某些情况下LINQ将自己使用字典,在这种情况下,需要重写查询)。

我们正在努力在使用LINQ时修复这些问题,因此我还建议filing a bug使用可编译的测试用例,以便我们确保您的案例在将来有效。

答案 1 :(得分:3)

您可能会遇到AOT limitation(如此one),其中AOT编译器无法正确确定要编译的类型,以确保代码可以在运行时工作。

  

如何防止此错误发生?

解决方案取决于受到的确切限制。 LINQ查询生成了大量的IL代码,因此对于开发人员(或apt编译器)来说,生成的内容并不总是很明显。这使得解决这个问题变得更加困难。

为了解决这些问题,我们需要相当多的信息,因此在http://bugzilla.xamarin.com填写错误报告要好得多。 E.g。

最重要的部分是您可以通过在终端窗口中运行以下内容来获取设备日志:

/Developer/MonoTouch/usr/bin/mtouch --logdev

然后执行/崩溃您的应用程序并将终端上的输出复制粘贴到错误报告中(或将其添加为附件)。