是否可以从MethodBuilder / ConstructorBuilder调用DynamicMethod

时间:2012-06-15 22:58:43

标签: c# reflection.emit dynamicmethod

我有一个从ConstructorBuilder创建的ILGenerator,我想用它创建并调用DynamicMethod,但是我得到一个InvalidOperationException - 无法从其他模块导入全局方法或字段。

var constructorBuilder = typeBuilder.DefineConstructor(...);
var ilGenFromCtor = constructorBuilder.GetILGenerator();
.
.
.
var dynamicMethod = new DynamicMethod("Name", ReturnType, Type.EmptyTypes, true);
var ilGenFromDynamicMethod = dynamicMethod.GetILGenerator();
.
.
var @delegate = dynamicMethod.CreateDelegate();

ilGenFromCtor.Emit(OpCodes.Call, @delegate.Method);

--Or

ilGenFromCtor.Emit(OpCodes.Call, dynamicMethod);

10x

1 个答案:

答案 0 :(得分:2)

因为你实际上是在运行时定义一个完整的,完整的程序集,所以你必须在程序集中的某个地方声明该方法(可能在你得到ConstructorBuilder的类中)它返回的TypeBuilder.DefineMethodMethodBuilder实例的重载。 DynamicMethod对象由.NET运行时完全不同于Reflection.Emit使用的对象。使用MethodBuilder定义方法后,您可以将其用作ILGenerator.Emit的第二个参数。