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実際には実行時に完全なアセンブリ全体を定義しているため、のオーバーロードの1つとTypeBuilder.DefineMethodそのMethodBuilderインスタンスを使用して、アセンブリ内のどこか(おそらく、取得元のクラス内)でメソッドを宣言する必要があります。戻り値。DynamicMethodオブジェクトは、.NETランタイムによって使用されるものとはまったく異なる方法で処理されますReflection.Emit。を使用してメソッドを定義したらMethodBuilder、それをの2番目のパラメーターとして使用できますILGenerator.Emit

于 2012-06-16T12:03:48.203 に答える