创建 DynamicMethod 时如何发出 IL 来调用 DynamicMethod?
调用 ILGenerator.Emit(OpCodes.Callvirt, myDynamicMethod);
时,IL 在执行时会产生 MissingMethodException
结果。
我用这个最少的代码重现了这个问题:
var dm1 = new DynamicMethod("Dm1", typeof(void), new Type[0]);
dm1.GetILGenerator().Emit(OpCodes.Ret);
var dm2 = new DynamicMethod("Dm2", typeof(void), new Type[0]);
var ilGenerator = dm2.GetILGenerator();
ilGenerator.Emit(OpCodes.Callvirt, dm1);
ilGenerator.Emit(OpCodes.Ret);
dm2.Invoke(null, new Type[0]); // exception raised here
最佳答案
您确实可以从另一个 DynamicMethod
调用 DynamicMethod
。
var ilGenerator = dm2.GetILGenerator();
ilGenerator.Emit(OpCodes.Call, dm1);
OpCodes.Callvirt应该在调用对象上的虚拟方法时使用(例如 ToString()
)。这不适用于DynamicMethod
。
OpCodes.Call应该使用。
关于c# - 如何在DynamicMethod中调用DynamicMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57229721/