3

这是我得到的错误:

| mscorlib | | 在使用 --aot-only 运行时尝试 JIT 编译方法“System.Linq.OrderedEnumerable`1:GetEnumerator ()”。

从我读过的内容来看,在这种情况下,编译器似乎不包含一个方法“GetEnumerator”,因为 LINQ 代码需要该方法。确保编译器包含它的正确做法是什么?

我在网上找到的几乎所有遇到这种情况的人都只是摆脱了 linq 查询并继续生活,但是当出现这样的事情时,我厌倦了重新编写我的代码。此外,我不确定究竟是哪个 linq 查询导致了问题,我正在慢慢检查我的代码并重新编写所有 linq 查询,直到找到它。

4

3 回答 3

3

GetEnumerator 方法并没有真正丢失 - 但在进入设备之前它不是 AOT-ed 。所以 JIT 试图在设备上编译它。现在由于 Apple 的限制,MonoTouch(或其他任何东西)不能在设备上进行 JIT 代码(但这将在不存在此类限制的模拟器上工作)。

那么真正的错误是什么:这是 AOT 编译器无法预测的(通用)类型(并为其编译代码)。

找到您的问题的一个技巧(比重写您拥有的每个 LINQ 代码更容易)是编译您的 C# 代码,然后 ildasm 程序集。接下来查找正在使用的方法 OrderedEnumerable`1 (LINQ 可以很容易地隐藏内容)。

一旦发现您可能需要重写该部分,但在某些情况下,您可以通过使需要类型(由 `1 表示)更加明显来“帮助”AOT 编译器。

于 2011-08-06T00:29:37.283 回答
1

#17 号在此链接中对您有帮助吗?

http://ios.xamarin.com/Documentation/Troubleshoot

“System.ExecutionEngineException:尝试 JIT 编译方法(包装器托管到托管)Foo[]:System.Collections.Generic.ICollection`1.get_Count()”

遗憾的是,您很可能需要“破解”一种解决方法来解决这个问题 - 但它是可以修复的。您能否用实际的 LINQ 查询更新您的问题?

于 2011-08-06T11:12:58.190 回答
0

发现有问题的代码行:

// currentDates is a List<DateTime>
return (from dt in currentDates orderby dt.Date ascending select dt).ToList();

我把它改成使用

CurrentDates.Sort()

并且避免调用未获得 AOT 编辑的 GetEnumerator。不再炸了。

于 2013-02-01T17:31:48.743 回答