C# 从调用的目标生成的异常

C# 从调用的目标生成的异常,c#,reflection.emit,C#,Reflection.emit,我写了这段代码: AssemblyName assemblyName = new AssemblyName("SamAsm"); AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); TypeBuilder typeBuilder = assemblyBuilder.DefineDyn

我写了这段代码:

    AssemblyName assemblyName = new AssemblyName("SamAsm");
    AssemblyBuilder assemblyBuilder =      Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
    TypeBuilder typeBuilder = assemblyBuilder.DefineDynamicModule("SamAsm.exe").DefineType("SamAsmType", TypeAttributes.Public);
    MethodBuilder methodBuilder1 = typeBuilder.DefineMethod("Main", MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(string) });
    ILGenerator gen = methodBuilder1.GetILGenerator();
    FieldInfo field1 = typeof(Form1).GetField("TextBox1", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

    MethodInfo method2 = typeof(Control).GetProperty("Text", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetGetMethod();
    MethodInfo method3 = typeof(String).GetMethod(
        "op_Equality",
        BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic,
        null,
        new Type[]
        {
            typeof(String),
            typeof(String)
        },
        null
    );
    MethodInfo method4 = typeof(MessageBox).GetMethod(
        "Show",
        BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic,
        null,
        new Type[]
        {
            typeof(String)
        },
        null
    );

    LocalBuilder a = gen.DeclareLocal(typeof(Boolean));

    System.Reflection.Emit.Label label42 = gen.DefineLabel();

    gen.Emit(OpCodes.Nop);
    gen.Emit(OpCodes.Ldarg_0);
    gen.Emit(OpCodes.Ldfld, field1);
    gen.Emit(OpCodes.Callvirt, method2);
    gen.Emit(OpCodes.Ldstr, "HI");
    gen.Emit(OpCodes.Call, method3);
    gen.Emit(OpCodes.Ldc_I4_0);
    gen.Emit(OpCodes.Ceq);
    gen.Emit(OpCodes.Stloc_0);
    gen.Emit(OpCodes.Ldloc_0);
    gen.Emit(OpCodes.Brtrue_S, label42);
    gen.Emit(OpCodes.Nop);
    gen.Emit(OpCodes.Ldstr, "You cracked me");
    gen.Emit(OpCodes.Call, method4);
    gen.Emit(OpCodes.Pop);
    gen.Emit(OpCodes.Nop);
    gen.MarkLabel(label42);
    gen.Emit(OpCodes.Ret);

    typeBuilder.CreateType().GetMethod("Main").Invoke(null, new string[] { null });
    assemblyBuilder.SetEntryPoint(methodBuilder1, PEFileKinds.WindowApplication);}
当我跑步时,它会停下来

typeBuilder.CreateType().GetMethod("Main").Invoke(null, new string[] { null });
出现此错误时:

从调用的目标生成的异常


我检查了发射的IL代码,我认为它是好的。我应该怎么做才能解决这个问题呢?

首先,当方法应该采用
格式1
(基于您对
ldfld
的使用)时,您似乎在声明要采用字符串参数的方法.

我刚刚在LINQPad中进行了测试,如果我删除了除第一个Nop和最后一个Ret之外的所有发出的代码,它就会起作用。因此,其余部分肯定有问题。我真的在il代码中找不到问题。。也许你能帮我吗?对不起,我对IL代码没有太多经验。如果您编写了等效的C#代码,请尝试将其与编译器生成的IL进行比较。