Метод отражения GetMethod не возвращает статический метод класса на iphone, но возвращает на симуляторе

#c# #iphone #xamarin.ios

#c# #iPhone #xamarin.ios

Вопрос:

Я столкнулся с проблемой, когда метод отражения GetMethod не возвращает статический метод для класса. Это происходит неправильно только на реальном iphone; на симуляторе это работает правильно. Я попробовал следующее:

 MethodInfo methInfo = _type.GetMethod (methodName);
  

и

 MethodInfo methInfo = _type.GetMethod (methodName, System.Reflection.BindingFlags.Static);
  

но ни один из них не возвращает метод, указанный в methodName. Указанный метод действительно существует, о чем свидетельствует тот факт, что он работает в симуляторе. Я подтвердил с помощью отладчика, что моя переменная-член _type действительно содержит правильную ссылку на тип класса. Методы, которые я пытаюсь получить, объявлены в классе как общедоступные.

Кто-нибудь сталкивался с этим раньше или знает, почему это будет работать на симуляторе, но не на реальном iphone?

Комментарии:

1. Симулятор и реальный телефон сильно отличаются. Возникают различия, подобные этому. Форумы MonoTouch, вероятно, лучшее место для запроса.

2. У меня создалось впечатление, что форумы MonoTouch переместились сюда; по крайней мере, ранее в этом году на форумах MonoTouch было сообщение об этом.

3. Команда MT следит за этим и, как правило, отвечает на большинство вопросов о MT.

Ответ №1:

Отражение, хотя и не полностью работоспособно на iOS, работает. Проблема в том, что компоновщик активирован в конфигурации устройства и отключает метод, поскольку он не используется. Компоновщик не может «видеть» вызовы отражения.

Если это пользовательский объект, украсьте его атрибутом PreserveAttribute:

 [Preserve(AllMembers=true)]
public class MyClass
{}
  

Если это объект из SDK, у вас есть два варианта:

  1. Полностью отключите компоновщик. Это нехорошо, поскольку конечный размер будет большим.
  2. Используйте метод один раз в своем коде напрямую, чтобы компоновщик знал, что он есть, и не удалял его.

Комментарии:

1. Спасибо, Димитрис. Вы попали в точку с этим ответом. Компоновщик действительно удалял методы. Я добавил атрибут Preserve , который вы упомянули, и мое приложение теперь корректно работает на iphone. Спасибо! 🙂

2. Система. Отражение работает на iOS так же хорошо, как и на любой другой архитектуре / ОС, поддерживаемой Mono. Что не поддерживается, так это System. Отражение. Emit, который является совершенно другим зверем. Хорошие советы в противном случае 🙂

3. Есть некоторые проблемы с системой. Отражение в iOS. Не все его аспекты работают, большинство из них работает.