2011-08-05 40 views
3

這裏是我得到的錯誤:當使用設備版本時,Monoouch在LINQ查詢時爆炸

| mscorlib | |在使用--aot-only運行時嘗試JIT編譯方法'System.Linq.OrderedEnumerable`1:GetEnumerator()'。

從我讀過它是什麼樣子的編譯器不包含在這種情況下「的GetEnumerator」的方法,該代碼需要,因爲LINQ的。什麼是確保編譯器包含它的正確的行爲?

運行到這一點,我在網上找到剛剛擺脫了LINQ查詢,並與生活繼續前進,但我厭倦了幾乎每個人都重新寫我的代碼時,這樣的事情彈出。另外我不確定究竟是哪個linq查詢導致了這個問題,我正在慢慢地通過我的代碼並重新編寫所有linq查詢,直到找到它。

+0

找到問題的代碼行,CurrentDates是一個列表: '返回(從DT在currentDates ORDERBY dt.Date升序選擇DT).ToList();' –

+3

我改變了它使用currentDates.Sort()和避免調用沒有得到AOT-ed的GetEnumerator。不再吹起來,希望我沒有浪費那麼多時間。 –

+0

+1,非常類似的問題,非常類似的修復。感謝指針。 – tomfanning

回答

0

發現問題的代碼行:

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

我改成了使用

CurrentDates.Sort() 

和避免調用一個沒有得到AOT-ED的GetEnumerator的。不再爆炸。

3

GetEnumerator方法並不是真的丟失 - 但它在進入設備之前沒有被AOT編輯。所以JIT試圖在設備上編譯它。現在,由於蘋果的限制,MonoTouch(或其他任何設備)不能在設備上使用JIT代碼(但在模擬器上不存在此限制)。

那麼,什麼是真正的錯誤:它是(通用)型帽子AOT編譯器無法預測(併爲它編寫代碼)。

找到您的問題的惡作劇(更容易比重新寫你擁有的每LINQ代碼)是編譯C#代碼,然後ILDASM大會。接下來找到使用哪種方法OrderedEnumerable`1(LINQ可以很容易地隱藏事物)。

一旦發現你可能需要重寫一部分,但是,在某些情況下,你可以「幫助」 AOT編譯器,使之更加明顯,類型(由'1表示)是必要的。

+0

十分感謝,我會嘗試這個 –

+0

我有這個問題。你能解釋如何提示AOT編譯器不去掉'GetEnumerable()'嗎?例如,這是在'IOrderedEnumerable '上。這是一個容易重現的AOT錯誤,這是我應該把它放在Xamarin的Bugzilla頁面上嗎? – jonathanpeppers

+0

@ Jonathan.Peppers我認爲這是不同的(如果它是我記得的),但每當有疑問總是填寫一個錯誤報告:-) – poupou

1

是否編號#17幫你在這個環節?

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

「System.ExecutionEngineException:試圖JIT編譯方法(包裝管理對管理)的Foo []:System.Collections.Generic.ICollection`1.get_Count()」

您可能很需要「破解」一個解決方法來解決這個問題,不幸的是 - 但它是可以修復的。你能否用實際的LINQ查詢更新你的問題?