Domanda

sto sviluppando per l'iPhone utilizzando C # e tecnologia Full AOT di Mono. Secondo il loro Limitazioni pagina ( link testuale ), a differenza dei tradizionali Mono /. NET, il codice su iPhone è staticamente compilato prima del tempo invece di essere compilato su richiesta da un compilatore JIT.

Quando si esegue l'hardware, la seguente eccezione si verifica:

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()

Secondo il documento limitazioni, System.Reflection.Emit non è supportato, ma affermano che come laterale dalla Reflection.Emit, "l'intera API Reflection, compreso Type.GetType (" someClass "), che elenca i metodi, elencando proprietà , attributi e valori che vanno a prendere funziona bene ".

Ho incluso il codice che causa l'eccezione ...

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

        ...

Il metodo sopra afferra un nome di proprietà da una tabella hash, e lo usa (insieme con obj) per creare un'istanza di AniValue. Solo in seguito, foo.Get () viene chiamato per recuperare il valore della proprietà. L'eccezione si verifica su propertyInfo.GetValue (obj, nullo).

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

Anche se ho una limitata esperienza con C #, JIT, AOT, e Riflessione, dovrebbe GetValue () grilletto JIT? UnityEngine.Color è una struttura, e la classe immagine è come sottoclasse di XObject, che è una sottoclasse di UnityEngine.MonoBehaviour. Il colore è una proprietà di immagine, e questo è ciò che il codice potrebbe essere sempre il valore di quando si verifica l'eccezione.

È interessante notare, è possibile compilare il codice utilizzando .NET 1.1, e tutto ciò che esegue bene. Solo quando si compila utilizzando .NET 2.1 si verifica l'eccezione.

Non so se c'è una soluzione o lavoro intorno a questo, ma sarei interessato a una visione chiara per quanto riguarda la causa.

È stato utile?

Soluzione

IIRC, v'è anche un avvertimento su farmaci generici attraverso la riflessione. I credere si chiama fuori interfacce piuttosto che tipi concreti, ma lo stesso può applicare -. In particolare quando si utilizza la riflessione

Personalmente, sto solo cadere riflessione quando si tratta di iPhone - è più facile. Sto ancora facendo meta-programmazione, ma sono pre-generazione di codice regolare (sul quadro completo) che ho poi prendere in consegna a MonoTouch. Sembra funzionare abbastanza robusto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top