如何发出调用动态方法的代码?

use*_*967 3 c# reflection reflection.emit ilgenerator

我正在尝试发出调用我之前发出的动态方法的代码:

iLGenerator.Emit(OpCodes.Call, dynamicMethod.GetMethodInfo());
Run Code Online (Sandbox Code Playgroud)

它有一个异常说:"MethodInfo必须是运行时MethodInfo对象"

有没有办法将动态方法转换为运行时方法?

Mik*_*ray 5

从我可以告诉你已经编译DynamicMethod成一个委托使用CreateDelegate.但是,如果您只是将DynamicMethod对象直接用作Emit的参数,它应该可以工作.示范:

using System.Reflection;
using System.Reflection.Emit;

public class Program
{
    public static void Main(string[] args)
    {
        var dynMethod = new DynamicMethod("test1", typeof(void), Type.EmptyTypes);
        var gen = dynMethod.GetILGenerator();
        gen.EmitWriteLine("Test");
        gen.Emit(OpCodes.Ret);

        var dynMethod2 = new DynamicMethod("test2", typeof(void), Type.EmptyTypes);
        gen = dynMethod2.GetILGenerator();
        gen.Emit(OpCodes.Call, dynMethod);
        gen.Emit(OpCodes.Ret);
        var method2 = (Action)dynMethod2.CreateDelegate(typeof(Action));
        method2();
    }
}
Run Code Online (Sandbox Code Playgroud)