2012-06-15 2 views
2

ConstructorBuilder에서 생성 한 ILGenerator가 있는데이를 사용하여 DynamicMethod를 만들고 호출하려고하지만 InvalidOperationException이 발생합니다. 전역 메서드 나 필드를 가져올 수 없습니다. 다른 모듈. 당신이 실제로 실행시 전체, 완전한 어셈블리를 정의하고 있기 때문에MethodBuilder/ConstructorBuilder에서 DynamicMethod를 호출 할 수 있습니까?

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 
+0

델리게이트를 호출 해 보았습니다 (Invoke() 메소드를 호출했습니다)? – svick

답변

2

, 당신은 하나를 사용하여 (아마 당신이 ConstructorBuilder을 가지고있는 클래스 내에서) 어셈블리 내 어딘가에 방법을 선언해야 할거야 TypeBuilder.DefineMethodMethodBuilder 인스턴스의 오버로드가 반환됩니다. DynamicMethod 개체는 Reflection.Emit이 사용하는 것보다 .NET 런타임에서 완전히 다르게 처리됩니다. MethodBuilder을 사용하여 메소드를 정의한 후에는 ILGenerator.Emit의 두 번째 매개 변수로 사용할 수 있습니다.

+0

이미 DefineMethod로 전환되었습니다. 감사합니다. . – Sagi

관련 문제