【问题标题】:Is it possible to call a DynamicMethod from MethodBuilder/ConstructorBuilder是否可以从 MethodBuilder/ConstructorBuilder 调用 DynamicMethod
【发布时间】:2012-06-15 22:58:43
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过调用委托(调用其Invoke() 方法)?

标签: c# reflection.emit dynamicmethod


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多