MonoTouch загадочным образом не компилирует методы и свойства?

У меня странная проблема, когда 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

person David Merriman    schedule 13.04.2012    source источник
comment
Вы можете объяснить, каким должен быть NavController? Это не метод (без скобок) и не геттер (не получение и не установка). Может быть, в этом вся проблема?   -  person Krumelur    schedule 16.04.2012
comment
Да, это свойство с геттером. Я обновил код, чтобы исправить свое упущение.   -  person David Merriman    schedule 16.04.2012


Ответы (2)


Это не похоже на то, что здесь можно решить.

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

person Rolf Bjarne Kvinge    schedule 13.04.2012
comment
Я не уполномочен прикреплять наш исходный код целиком, но я отправлю сообщение об ошибке и прикреплю двоичные файлы. - person David Merriman; 16.04.2012
comment
Мы изолировали причину. В MonoDevelop есть ошибка при ссылке на сборку, которая также является приложением iOS. Он дает компилятору путь к удаленной сборке внутри пакета приложения вместо обычного скомпилированного exe. Ссылка: bugzilla.xamarin.com/show_bug.cgi?id=4530 - person David Merriman; 20.04.2012

Не могли бы вы явно объявить переменную

UINavigationController navController = myClass.NavController;

В качестве альтернативы мне интересно, связано ли это вообще с необходимостью ожидания вызова метода UIViewController.ViewDidLoad, поскольку внутренние компоненты класса еще не были инициализированы?

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

person AkiAki007    schedule 16.04.2012
comment
В фактическом коде свойство передается в качестве аргумента функции, но оно будет генерироваться независимо от того, как я его использую. Никакой код не связан с представлениями, только с контроллерами, и в прошлом это работало; Я все еще отслеживаю, когда именно он сломался. - person David Merriman; 16.04.2012
comment
Для меня это также указывает на то, что есть движущиеся винтики, и представленный выше код не может быть фактическим виновником и, вероятно, связан с чем-то еще, что связано с временем выполнения. Вы вызываете этот метод с помощью отражения? Честно говоря, я не могу придумать никакой другой причины, по которой приведенный выше код не будет работать, за исключением того, что он нигде не упоминается явно, и, таким образом, компилятор iOS удаляет код, поскольку он не упоминается для создания как можно меньшего исполняемого файла. - person AkiAki007; 17.04.2012
comment
Как указано в вопросе, свойство не вызывается через отражение. - person David Merriman; 17.04.2012