C# 如何在DynamicMethod中调用DynamicMethod

C# 如何在DynamicMethod中调用DynamicMethod,c#,reflection,cil,reflection.emit,dynamicmethod,C#,Reflection,Cil,Reflection.emit,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); v

如何在创建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);
在对象上调用虚拟方法时应使用(例如
ToString()
)。这不适用于
DynamicMethod

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

应该改为使用。

现在得到了无效的程序异常。从我从其他错误中得到的信息来看,
DynamicMethod
s只能是静态的,对吗?我从现有方法复制IL,并用dynamics替换方法调用,这意味着它不是调用
string.GetHashCode()
(例如)而是调用动态
GetHashCode(string)
。从我对IL的基本理解来看,2应该是等效的(即,只需替换call指令,其余的就可以了)。@Sellorio我正在visual studio 2017中运行代码,没有出现错误。尝试将您的ctor更改为
newdynamicmethod(“Dm1”,typeof(void),new-Type[0],typeof(object),true)是的,基本代码可以工作,但我的主代码还不能正常工作。(参见前面的注释)正确,它们只是静态的。在运行时添加实例方法的唯一方法是使用
System.Reflection.Emit.TypeBuilder
,而不是使用现有类型。通过使第一个参数为该类型,可以使
DynamicMethod
模拟实例方法。然而,没有办法称之为虚拟的