c# - 如何在DynamicMethod中调用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);
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/

相关文章:

c# - 在 XAML 中,d : (design time) 的反义词是什么

c# - 如何定义 'value'属性 setter 参数

Java反射题

pointers - 如何从接口(interface){}获取结构成员的指针

java - 实例化对象名称并设置其值的通用方法

c# - "final"在 IL 中是什么意思?

CIL指令 "isinst <valuetype>"

c# - 如何告诉 NSwag C# 客户端生成器使用我们的 DTO 而不是生成新的 DTO?

c# - 在更改WPF MVVM应用程序中的选项卡时,DataGrid失去选择,排序,分组等功能。

c# - 什么是 "Error initializing filter ' drawtext' with args..."在 c# 进程类中使用 ffmpeg 时出现错误?