Я разрабатываю для iPhone с помощью Всей технологии C# и Mono AOT. Согласно их странице Limitations (текст ссылки), в отличие от Моно традиционного/.NET, код iPhone статически компилируется заранее вместо того, чтобы быть скомпилированным по требованию JIT-компилятором.
При работе аппаратных средств происходит следующее исключение:
ExecutionEngineException: Attempting to JIT compile method 'System.Reflection.MonoProperty:GetterAdapterFrame (System.Reflection.MonoProperty/Getter`2,object)' while running with --aot-only.
System.Reflection.MonoProperty.GetValue (System.Object obj, System.Object[] index) [0x00000]
Ani+AniValue.Get ()
Ani.CreateAnimations (System.Object obj, System.Collections.Hashtable properties, Single duration, System.Collections.Hashtable options, AniType type)
Ani.Method (AniType type, System.Object obj, Single duration, System.Collections.Hashtable _properties, System.Collections.Hashtable _options)
Ani.From (System.Object obj, Single duration, System.Collections.Hashtable _properties)
xObject+<>c__CompilerGenerated5.MoveNext ()
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
xObject:StartAnimation(Animate, GameObject, Object, Object)
SceneSplash:CreateBackground()
SceneSplash:OnSetup()
SceneSplash:OnSceneActivate(Callback)
GameController:ActivateScene()
GameController:DeactivateScene()
GameController:SceneLoaded(Scene, GameObject, SceneBase)
SceneBase:Start()
Согласно документу Ограничений, Системе. Отражение. Испустите не поддерживается, но они заявляют что как сторона от Отражения. Испустите, "весь API Reflection, включая Тип. GetType ("someClass"), перечисляя методы, перечисляя свойства, выбирая атрибуты и значения работает просто великолепно".
Я включал код, который вызывает исключение...
void CreateAnimations(System.Object obj, Hashtable properties, float duration,
Hashtable options, AniType type)
{
foreach (DictionaryEntry item in properties)
{
name = (string)item.Key; // Extract name and value
System.Object value = item.Value;
AniValue foo = new AniValue(obj, name); // Create value object
/* To exception occurs inside Get() */
System.Object current = foo.Get(); // Get current value
...
Вышеупомянутый метод захватывает имя свойства от хеш-таблицы и использует его (наряду с obj) для создания экземпляра AniValue. Просто позже, нечто. Доберитесь (), назван для получения значения свойства. Исключение происходит на propertyInfo. GetValue (obj, пустой указатель).
using System.Reflection
public class AniValue
{
static BindingFlags bFlags = BindingFlags.Public | BindingFlags.NonPublic
| BindingFlags.Instance | BindingFlags.Static;
System.Object obj; // Object a field or property is animated on
string name; // Name of the field or property
System.Type objType; // Type object
FieldInfo fieldInfo; // FieldInfo object
PropertyInfo propertyInfo; // PropertyInfo object
public AniValue(System.Object o, string n)
{
obj = o;
name = n;
objType = obj.GetType();
fieldInfo = objType.GetField(n, AniValue.bFlags);
propertyInfo = objType.GetProperty(n, AniValue.bFlags);
if (fieldInfo == null && propertyInfo == null)
{
throw new System.MissingMethodException("Property or field '" + n
+ "' not found on " + obj);
}
}
// Get field or property
public System.Object Get()
{
if (propertyInfo != null)
{
/* The next line causes the Exception */
return propertyInfo.GetValue(obj, null);
}
else
{
return fieldInfo.GetValue(obj);
}
}
...
Хотя я ограничил опыт с C#, JIT, AOT и Отражение, должны, GetValue () инициировали JIT? UnityEngine. Цвет является структурой, и класс Изображения как подкласс xObject, который является подклассом UnityEngine. MonoBehaviour. Цвет является свойством Изображения, и именно это код мог получать значение того, когда исключение происходит.
Интересно, можно скомпилировать код с помощью.NET 1.1, и все выполняется прекрасный. Только при компиляции использования.NET 2.1 делает исключение, происходят.
Я не знаю, существует ли решение или работа вокруг к этому, но я интересовался бы любым пониманием относительно причины.
IIRC, есть также предупреждение о дженериках через отражение. Я полагаю, что там говорится об интерфейсах, а не о конкретных типах, но то же самое может быть применимо - в частности при использовании отражения.
Лично я просто отказываюсь от рефлексии при работе с iPhone - это проще. Я все еще занимаюсь мета-программированием, но предварительно генерирую обычный код (на полном фреймворке), который затем переношу в MonoTouch. Кажется, это работает довольно надежно.