У меня странная проблема, когда MonoTouch, похоже, либо не компилирует методы, либо не может найти скомпилированный метод, который ему предписано вызвать, и только на устройстве в конфигурации выпуска - сборки отладки в порядке. Я безуспешно пытался воспроизвести его с помощью более простого образца кода, поэтому я сомневаюсь, что вы сможете увидеть поведение с помощью приведенного ниже кода. Но по сути это то, что я делаю:
using System;
using MonoTouch.UIKit;
public class MyClass
{
private UINavigationController _navController;
private UIViewControler _viewController;
public UINavigationController NavController
{
get
{
if (_navController == null)
{
if (_viewController == null)
{
_viewController = new UIViewController();
}
_navController = new UINavigationController(_viewController);
}
return _navController;
}
}
}
Затем каким-то другим способом ...
public void SomeMethod()
{
MyClass myClass = new MyClass();
var navController = myClass.NavController; // <-- This is where it throws
}
Исключение, которое я получаю, - это стандартное сообщение JIT-компиляции, в котором говорится, что оно попыталось выполнить JIT get_NavController (). Я нахожу это очень странным, потому что нет виртуальных дженериков, нет LINQ, компоновщик выключен и, похоже, не задействовано ничего, что обычно вызывает JIT. Я также подтвердил, что он будет вызывать другие методы и свойства, определенные в MyClass, но не конструктор или System.Object
унаследованные методы. Reflection показывает, что у myClass.GetType().GetMembers()
есть MemberInfo для всего, чего я ожидал. Тем не менее, только для Release | iPhone я не могу получить доступ к этим методам или свойствам. Единственный логический вывод, к которому я могу прийти, заключается в том, что на этапе компиляции aot они отсутствуют, и я не знаю, почему это вообще могло произойти, не говоря уже только о конфигурации Release.
У меня вопрос: что могло быть причиной такой ситуации и что делать дальше, чтобы исправить это? Я даже не уверен, куда идти дальше при отладке этого или о чем сообщать об ошибке, потому что я не могу воспроизвести это вне контекста нашего (гораздо) более крупного проекта.
Обновление: был запрошен точный текст исключения.
System.ExecutionException: Attempting to JIT compile method
'MyNamespace.MyClass.get_NavController ()' while running with --aot-only