DynamicMethod中如何调用DynamicMethod
How to call DynamicMethod in 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 应该改为使用。
如何在创建 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 应该改为使用。