Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态代码生成问题_C#_.net_Reflection.emit_Il - Fatal编程技术网

C# 动态代码生成问题

C# 动态代码生成问题,c#,.net,reflection.emit,il,C#,.net,Reflection.emit,Il,这段代码是一个异常:调用异常,请帮助,我不知道发生了什么,我认为是Add的问题,因为当我推堆栈整数时,他工作,当我推左值时,它不工作,谢谢 static void Main(string[] args) { AppDomain dominioAplicacion = System.Threading.Thread.GetDomain(); AssemblyName nombre_Del_Ensamblado = new AssemblyName("ASS"

这段代码是一个异常:调用异常,请帮助,我不知道发生了什么,我认为是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");

    }
static void Main(字符串[]args)
{
AppDomain DominioApplicion=System.Threading.Thread.GetDomain();
AssemblyName nombre_Del_Ensamblado=新的AssemblyName(“ASS”);
AssemblyBuilder ensambladoBld=DominioApplicationon.DefinedDynamicAssembly(nombre_Del_Ensamblado,AssemblyBuilderAccess.RunAndSave);

ModuleBuilder ModuleBld=ensambladoBld.definedDynamicModule(“您的IL完全无效。异常情况并不严重,但您正在JIT编译器的内部进行修补。操作码。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的外观。

您的IL完全无效。异常情况并不严重,但您正在修改JIT编译器的内部。操作码。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的外观。

请发布异常文本。完整的IL代码应该是什么?如果它在程序集中,该IL代码会工作吗?我会开始查找错误。请发布异常文本。应该做什么ld是完整的IL代码吗?如果它在程序集中,该IL代码会工作吗?我会开始查找错误there@cary,听起来像是一个解决方案。请通过标记“已回答”来关闭线程。@cary,听起来像是一个解决方案。请通过标记“已回答”来关闭线程。