3

I have an ILGenerator created from ConstructorBuilder, and I want to create and call a DynamicMethod with it but I get an InvalidOperationException - Unable to import a global method or field from a different module.

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
  • Have you tried invoking the delegate (calling its Invoke() method)? Commented Jun 15, 2012 at 23:29

1 Answer 1

2

Because you're actually defining an entire, complete assembly at runtime, you're going to have to declare the method somewhere within the assembly (perhaps within the class from which you got the ConstructorBuilder) by using one of the overloads of TypeBuilder.DefineMethod and the MethodBuilder instance it returns. DynamicMethod objects are handled entirely differently by the .NET runtime than what Reflection.Emit uses. Once you've defined your method using the MethodBuilder, you can use it as your second parameter to ILGenerator.Emit.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.