2010-12-06 1 views
3

내가 System.Reflection.Emit을 사용하고, 어떤 점에서 나는 MethodBuilder에서 대리자를 만들려면 : 나는 정적 함수 뭔가 대표단을 만들 것을 찾을 수ILGenerator : 부하 생성 방법

MethodBuilder fooBuilder = createFooMethodBuilder(); 
ILGenerator ilGenerator = ... 
Type delegateType = typeof(DelegateType); 
LocalBuilder delegateVar = ilGenerator.DeclareLocal(delegateType); 
//Somehow create emit instructions to create delegate from fooBuilder 
//Store delegate in delegateVar using 

다음과 같이 사용됩니다 :

ldnull 
ldftn void class Test.MainClass::bar() 
newobj instance void class Test.DelegateType::'.ctor'(object, native int) 

하지만 지금은 붙어 있습니다. MethodBuilder를 ldftn하는 방법이 필요하다. 그리고 다음 줄에 대한 지시를 내릴 방법이 필요하다. 그리고 네이티브 int를 받아들이는 생성자를 얻는 방법을 모른다.

제안 사항?

+0

흥미로운 질문입니다. 솔루션을 얻지 못하면 [Delegate.CreateDelegate] (http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx)를 대신 호출 할 수 있습니다. – dtb

답변

6

native int은 C#에서 IntPtr입니다.

당신은 Type.GetConstructor를 사용하여 대리자 형식에 대한 ConstructorInfo를 얻을 수 있습니다 :

var constructorInfo = 
    delegateType.GetConstructor(new Type[] { typeof(object), typeof(IntPtr) }); 

그런 다음이 같은 IL 지침을 방출 할 수있다 :

il.Emit(OpCodes.Ldnull); 
il.Emit(OpCodes.Ldftn, someMethodInfo); 
il.Emit(OpCodes.Newobj, constructorInfo); 
0

ILGenerator 클래스는를 취하는 발광 과부하가 있습니다 methodinfo이므로 ilGenerator.Emit(Opcodes.ldftn, mi)과 같이 할 수 있습니다. 여기서 mi은 호출 할 메서드입니다. 리플렉션 API를 사용하여 찾은 메소드 일 수도 있고 MethodBuilder를 사용하여 만든 다른 메소드 (MethodInfo에서 파생 됨) 일 수도 있습니다.

마찬가지로 생성자를 호출하려면 대상 오버로드에 대한 ConstructorInfo를 제공하는 newobj 명령어를 내 보냅니다.