TinyIoC, Xamarin.iOS, настройки компоновщика

Я пытаюсь заставить TinyIoC работать над Xamarin.iOS, но мне не везет. Настройки компоновщика моего проекта установлены на "Link SDK сборки только".

Я буквально делаю что-то такое простое:

public interface IPerson { int age { get; } }
public class Person : IPerson { public int age { get { return 99; } } }

Тогда мой регистрационный код выглядит следующим образом (я только что поместил его в свой AppDelegate в игрушечном приложении):

TinyIoCContainer.Current.Register<IPerson,Person>.AsMultiInstance();

Когда я пытаюсь получить IPerson, я получаю исключение времени выполнения, в котором говорится, что IPerson не может быть разрешен (этот код находится сразу после регистрационного кода в AppDelegate игрушечного приложения):

IPerson person = TinyIoCContainer.Current.Resolve<IPerson>();

Вот ошибка:

Unable to resolve type: TinyTest.IPerson

Однако, если я изменю настройки компоновщика на "Не связывать", все работает нормально. Это, очевидно, несостоятельно, потому что двоичный код становится огромным.

Я попытался разместить атрибуты [Preserve] в интерфейсе IPerson и классе Person, но без кубиков. Я также попытался просто вручную объявить переменную типа IPerson и создать ее экземпляр с помощью нового Person(), а затем захватить свойство age, просто чтобы убедиться, что тип был включен в сборку, но там тоже не повезло.

Чувствую, что я что-то здесь упускаю - кто-то может указать мне правильное направление?

Спасибо!

1 ответ

Решение

Это ошибка, потому что отражение используется для вызова внутреннего Expression<TDelegate> конструктор.

Компоновщик не может анализировать использование отражения (это выходит за рамки статического анализа), поэтому он должен знать об этих особых случаях.

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

Продолжайте использовать параметр Link SDK по умолчанию, но добавьте --linkskip=System.Core к вашим дополнительным аргументам mtouch, внутри параметров проекта, iOS Build.

Таким образом, только System.Core (из SDK) не будет связан, и увеличение размера будет намного меньше. Конечно, это только обходной путь, пока новая версия не исправит проблему должным образом.

Другие вопросы по тегам