أنا مرتبك حول بعض كود الانعكاس، وتبحث عن نظرة ثاقبة

StackOverflow https://stackoverflow.com/questions/2424490

سؤال

أنا أضعف لجهاز iPhone باستخدام تقنية C # و Mono Aot الكامل. وفقا لمن محددات صفحة (رابط النص)، على عكس أحادي / .NET التقليدية، يتم تجميع التعليمات البرمجية على جهاز iPhone مؤقتا قبل الزمن بدلا من تجميعها عند الطلب من قبل مترجم JIT.

عند التشغيل على الأجهزة، يحدث الاستثناء التالي:

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

وفقا لمستند القيود، فإن System.Reflection.emit غير مدعوم، لكنها تذكر ذلك كجانب من الانعكاس. والقيم تعمل بشكل جيد فقط. "

لقد قمت بتضمين الرمز الذي يسبب الاستثناء ...

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. فقط بعد ذلك، يتم استدعاء foo.get () لاسترداد قيمة الخاصية. يحدث الاستثناء على 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);
        }
    }
    ...

على الرغم من أن لدي خبرة محدودة مع C #، JIT، AOT، والتفكير، فيجب أن جيتيفالوي () الزناد جيت؟ UnityEngine.Color هو بنية، وفئة الصورة هي فئة فرعية من Xobject، وهي فئة فرعية من UnityEngine.monobehaviour. اللون هو خاصية للصورة، وهذا هو ما يمكن أن يحصل عليه الرمز عند حدوث الاستثناء.

ومن المثير للاهتمام، يمكنك ترجمة التعليمات البرمجية باستخدام .NET 1.1، وينفذ كل شيء بشكل جيد. فقط عند ترجمة باستخدام .NET 2.1 هل يحدث الاستثناء.

لا أعرف ما إذا كان هناك حل أو حل حول هذا، لكنني سأكون مهتما بأي رؤية فيما يتعلق بالسبب.

هل كانت مفيدة؟

المحلول

IIRC، هناك أيضا تحذير من الجنراء عبر التفكير. أنا يصدق وتدعو واجهات بدلا من أنواع الخرسانة، ولكن قد ينطبق الشيء نفسه - في خاص عند استخدام الانعكاس.

شخصيا، أنا فقط إسقاط انعكاس عند التعامل مع iPhone - إنه أسهل. ما زلت أقوم بعمل برمجة ميتا، لكنني أقوم بإنشاء رمز منتظم مسبق (في الإطار الكامل) الذي استغرقته بعد ذلك إلى Monotouch. يبدو أن العمل بقوة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top