使用设备构建时,Monotouch会在LINQ查询上爆炸

时间:2011-08-05 21:39:56

标签: c# iphone linq xamarin.ios aot

这是我得到的错误:

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

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

几乎所有遇到过我在网上发现的人只是摆脱了linq查询并继续生活,但我厌倦了在这样的事情出现时重新编写我的代码。此外,我不确定究竟哪个linq查询引起了问题,我正在慢慢浏览我的代码并重新编写所有linq查询,直到找到它为止。

3 个答案:

答案 0 :(得分:3)

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

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

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

一旦找到,可能需要重写该部分,但在某些情况下,您可以“帮助”AOT编译器,更明显的是需要类型(由`1表示)

答案 1 :(得分:1)

#17号是否可以帮助您链接?

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

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

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

答案 2 :(得分:0)

找到了令人讨厌的代码行:

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

我将其改为使用

CurrentDates.Sort()

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