如何在 DynamicMethod 中调用 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。

相关内容

  • 没有找到相关文章

最新更新