Я смущен некоторым Отражательным кодом и поиском понимания

Я разрабатываю для 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 делает исключение, происходят.

Я не знаю, существует ли решение или работа вокруг к этому, но я интересовался бы любым пониманием относительно причины.

6
задан Michael Ryan 11 March 2010 в 12:07
поделиться

1 ответ

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

Лично я просто отказываюсь от рефлексии при работе с iPhone - это проще. Я все еще занимаюсь мета-программированием, но предварительно генерирую обычный код (на полном фреймворке), который затем переношу в MonoTouch. Кажется, это работает довольно надежно.

3
ответ дан 17 December 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: