簡體   English   中英

動態代碼生成問題

[英]Problems with generation of dynamic code

這段代碼是一個例外:調用例外,請幫忙,我不知道會發生什么,我認為Add有點問題,因為當我推入棧整數時,當我推入左值時,他會起作用,這是行不通的,謝謝

static void Main(string[] args)
    {
        AppDomain dominioAplicacion = System.Threading.Thread.GetDomain();
        AssemblyName nombre_Del_Ensamblado = new AssemblyName("ASS");
        AssemblyBuilder ensambladoBld = dominioAplicacion.DefineDynamicAssembly(nombre_Del_Ensamblado, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduloBld = ensambladoBld.DefineDynamicModule("<MOD");
        TypeBuilder claseContenedoraBld = moduloBld.DefineType("claseContenedora");
        MethodBuilder mainBld = claseContenedoraBld.DefineMethod("main", MethodAttributes.Public | MethodAttributes.Static, typeof(void), Type.EmptyTypes);
        ILGenerator il = mainBld.GetILGenerator();

        FieldBuilder campoBld = claseContenedoraBld.DefineField("x", typeof(int), FieldAttributes.Public | FieldAttributes.Static);
        il.Emit(OpCodes.Ldc_I4, 2);
        il.Emit(OpCodes.Stsfld, campoBld);

        FieldBuilder campoBld1 = claseContenedoraBld.DefineField("x1", typeof(int), FieldAttributes.Public | FieldAttributes.Static);

        il.Emit(OpCodes.Ldc_I4, 2);
        il.Emit(OpCodes.Stsfld, campoBld1);

        il.Emit(OpCodes.Ldftn, campoBld);
      //il.Emit(OpCodes.Unbox, typeof(int));
      //il.Emit(OpCodes.Stloc_0);
        il.Emit(OpCodes.Ldloc_0);


        il.Emit(OpCodes.Ldftn, campoBld1);
        //il.Emit(OpCodes.Unbox, typeof(int));
        il.Emit(OpCodes.Stloc_1);
        il.Emit(OpCodes.Ldloc_1);
        //il.Emit(OpCodes.Box, typeof(int));
        //il.Emit(OpCodes.Ldftn, campoBld1);
        //il.Emit(OpCodes.Unbox, typeof(int));

        il.Emit(OpCodes.Add);
        il.Emit(OpCodes.Pop);
        //il.Emit(OpCodes.Stsfld, campoBld1);




        il.Emit(OpCodes.Ret);


        Type t = claseContenedoraBld.CreateType();

        object ptInstance = Activator.CreateInstance(t, new Type[] { });

        t.InvokeMember("main", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
            null,
            ptInstance,
            new object[0]);

        var x = t.GetField("x");

    }

您的IL完全無效。 異常不是很好,但是您正在修補JIT編譯器。 Opcodes.Ldsftn並沒有您認為的那樣,您將需要Ldsfld來加載字段。 我真的無法弄清楚您要編寫什么代碼,但這應該很接近。 無論如何它不會崩潰:

        FieldBuilder campoBld = claseContenedoraBld.DefineField("x", typeof(int), FieldAttributes.Public | FieldAttributes.Static);
        il.Emit(OpCodes.Ldc_I4, 2);
        il.Emit(OpCodes.Stsfld, campoBld);
        FieldBuilder campoBld1 = claseContenedoraBld.DefineField("x1", typeof(int), FieldAttributes.Public | FieldAttributes.Static);
        il.Emit(OpCodes.Ldc_I4, 2);
        il.Emit(OpCodes.Stsfld, campoBld1);
        il.Emit(OpCodes.Ldsfld, campoBld);
        il.Emit(OpCodes.Ldsfld, campoBld1);
        il.Emit(OpCodes.Add);
        il.Emit(OpCodes.Pop);
        il.Emit(OpCodes.Ret);

弄清楚要使用哪種IL的最好方法是先用C#編寫代碼,然后用Ildasm.exe對其進行反匯編以查看IL的外觀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM