#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. Спасибо, Димитрис. Вы попали в точку с этим ответом. Компоновщик действительно удалял методы. Я добавил атрибут Preserve , который вы упомянули, и мое приложение теперь корректно работает на iphone. Спасибо! 🙂
2. Система. Отражение работает на iOS так же хорошо, как и на любой другой архитектуре / ОС, поддерживаемой Mono. Что не поддерживается, так это System. Отражение. Emit, который является совершенно другим зверем. Хорошие советы в противном случае 🙂
3. Есть некоторые проблемы с системой. Отражение в iOS. Не все его аспекты работают, большинство из них работает.