3

我有一个从 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
4

1 回答 1

2

因为您实际上是在运行时定义一个完整的、完整的程序集,所以您将不得不在程序集中的某处(可能在您从中获得 的类中ConstructorBuilder)声明该方法,方法是使用 的重载之一TypeBuilder.DefineMethodMethodBuilder它的实例返回。DynamicMethod.NET 运行时处理对象的方式与使用的方式完全不同Reflection.Emit。使用 定义方法后MethodBuilder,可以将其用作ILGenerator.Emit.

于 2012-06-16T12:03:48.203 回答