2

在创建 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
4

1 回答 1

2

您确实可以DynamicMethod从另一个调用 a DynamicMethod

var ilGenerator = dm2.GetILGenerator();
ilGenerator.Emit(OpCodes.Call, dm1);

OpCodes.Callvirt应该在调用对象(例如ToString())上的虚拟方法时使用。这不适用于DynamicMethod.

应改为使用OpCodes.Call 。

于 2019-07-27T06:35:40.023 回答