Ошибка Monotouch JIT на устройстве с LINQ - PullRequest
2 голосов
/ 13 декабря 2011

Я пытаюсь запустить наше приложение на устройстве iOS через опцию Debug | iPhone в MonoTouch.Однако мы довольно быстро сталкиваемся с проблемой.Приложение аварийно завершает работу со следующим исключением

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 ]

5 голосов
/ 13 декабря 2011

Проблема заключается в том, что в качестве словаря в словаре используются типы значений, как описано здесь . Изменение словаря на отсутствие типа значения в качестве ключа, возможно, сработает в этом случае (к сожалению, в некоторых случаях LINQ будет использовать словари самостоятельно, и в этом случае потребуется переписать запрос).

Мы работаем над устранением этих проблем при использовании LINQ, поэтому я бы также предложил отправить сообщение об ошибке с помощью компилируемого тестового примера, чтобы мы могли убедиться, что ваш случай работает в будущем.

3 голосов
/ 13 декабря 2011

Возможно, вы достигли ограничения AOT (например, one ), когда компилятор AOT не смог правильно определить типы для компиляции, опередиввремя, чтобы код мог работать во время выполнения.

Как я могу предотвратить возникновение этой ошибки?

Решение зависит от того, какое именно ограничение применяется.LINQ-запросы генерируют много IL-кода, поэтому разработчикам (или компилятору apt) не всегда ясно, что генерируется.Это делает работу вокруг проблемы немного сложнее.

Чтобы разобраться в таких проблемах, нам понадобится достаточно информации, поэтому заполнение отчета об ошибке на http://bugzilla.xamarin.com намного лучше.Например,

Самая важная часть - это журналы устройства, которые вы можете получить, запустив следующее в окне терминала:

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

Затем запустите / завершите работу приложения и скопируйте и вставьте вывод,на терминале, в отчет об ошибке (или добавить его в качестве вложения).

...