Question

Je développe pour l'iPhone en utilisant C # et la technologie pleine AOT Mono. Selon leur Limitations Page ( ), contrairement à Mono / traditionnel. NET, le code sur l'iPhone est compilé statiquement à l'avance au lieu d'être compilé sur demande par un compilateur JIT.

Lors de l'exécution sur le matériel, l'exception suivante se produit:

ExecutionEngineException: Attempting to JIT compile method 'System.Reflection.MonoProperty:GetterAdapterFrame<Image, UnityEngine.Color> (System.Reflection.MonoProperty/Getter`2<Image, UnityEngine.Color>,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()

D'après le document Limitations, System.Reflection.Emit est pas pris en charge, mais ils affirment que côté de Reflection.Emit, « l'ensemble de l'API de réflexion, y compris Type.GetType ( » someClass »), les méthodes d'inscription, répertoriant les propriétés , les attributs et les valeurs allant chercher fonctionne très bien. "

J'ai inclus le code qui est à l'origine l'exception ...

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

        ...

Le procédé ci-dessus prend un nom de propriété à partir d'une table de hachage, et l'utilise (avec obj) pour créer une instance de AniValue. Juste après, foo.Get () est appelée pour récupérer la valeur de la propriété. L'exception se produit sur propertyInfo.GetValue (obj, null).

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);
        }
    }
    ...

Bien que j'ai une expérience limitée avec C #, JIT, AOT, et la réflexion, devrait GetValue () déclencheur JIT? UnityEngine.Color est un struct, et la classe d'image est la sous-classe de XObject, qui est une sous-classe de UnityEngine.MonoBehaviour. La couleur est une propriété de l'image, et est ce que le code pourrait être obtenir la valeur du moment où l'exception se produit.

Il est intéressant, vous pouvez compiler le code en utilisant .NET 1.1, et tout bien exécute. Seulement lorsque vous compilez en utilisant .NET 2.1 ne se produit l'exception.

Je ne sais pas s'il y a une solution ou une solution à cela, mais je serais intéressé par un aperçu de la cause.

Était-ce utile?

La solution

IIRC, il y a aussi un avertissement sur les médicaments génériques par réflexion. I croire il appelle les interfaces plutôt que des types de béton, mais le même peut demander -. particulier lorsque vous utilisez la réflexion

Personnellement, je suis juste laisser tomber la réflexion en traitant avec l'iPhone - il est plus facile. Je suis toujours faire une méta-programmation, mais je suis pré-génération de code régulier (sur le cadre complet) que je puis prendre vers MonoTouch. Il semble fonctionner assez robuste.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top