2012-11-20 4 views
3

이것은 명백한 것처럼 들리지만 많은 어려움을 겪고 있습니다. 기본적으로, 내가하고있는 일은 Reflection.Emit을 사용하는 메소드를 생성하는 것이고, 나는 그것을 호출하고 싶다. 지금까지 메소드를 구축하고 있지만 "메소드가 작성되기 전에 호출 된 멤버가 지원되지 않기 때문에 메소드를 참조한 후 메소드를 참조 할 수 없습니다."Reflection.Emit을 사용하여 메서드 만들기 및 호출

AssemblyBuilder assembly; 
ModuleBuilder module; 
TypeBuilder containerTypeBuilder; 
Type containerType; 
var name = new AssemblyName(); 
name.Name = "DynamicWrapper"; 
var domain = Thread.GetDomain(); 
assembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave); 
module = assembly.DefineDynamicModule(assembly.GetName().Name, false); 
containerTypeBuilder = module.DefineType("__DynamicWrapperType", 
           TypeAttributes.Public | TypeAttributes.Class | 
           TypeAttributes.AutoClass | 
           TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | 
           TypeAttributes.AutoLayout, typeof(object)); 
//build method 
var mb = containerTypeBuilder.DefineMethod("generatedmethod" + (unique++), 
           MethodAttributes.Public | MethodAttributes.Static, typeof (int), 
           new Type[] {}); 
//build method body and all that 
..... 
var type=module.GetType("__DynamicWrapperType"); 
var info=type.GetMethod(mb.Name, BindingFlags.Static | BindingFlags.Public); //error here 

는 어떻게 새롭게 구축 방법을 내가 그것을 호출 할 수 있도록를로드 할 : 여기

나는 기본적으로 무엇입니까?

또한 mb.Invoke을 시도했지만 "호출 된 멤버가 동적 모듈에서 지원되지 않습니다."라는 결과가 나타납니다. 개별 방법 (들), 다음 DynamicMethod 훨씬 더 나은 선택을 작성하는 경우

답변

4

(당신의 방법은 정적 특히 이후) - 당신은 단지 그 대리인에게 CreateDelegate (대리자 유형을 지정), 캐스트을 사용하고 호출 . 또한 오버 헤드가 적고 수집 할 수 있습니다.

하지만 당신은 MethodBuilder을 사용하도록 강요하는 경우 : 당신이 다음 (CreateType에서 반환) 지금 실제 유형에 반사를 사용 TypeBuilderCreateType를 사용해야합니다.

+0

DynamicMethod를 처음부터 고려하지 않은 이유가 확실하지 않습니다. 그게 효과가 있는지 알게 될 것입니다. (단위 테스팅을 위해서만 쓰일 수 있습니다. 따라서 수집하기가 매우 중요하지 않지만, 사용하기가 더 쉽습니다.) – Earlz

+0

@Earlz ** 많이 ** 쉽습니다. AssemblyBuilder, ModuleBuilder, AssemblyName, TypeBuilder , MethodBuilder - 기본적으로 ILGenerator. –

+0

네, 그냥 약 2 초 DynamicMethod를 사용하여 변환이 모든 고정있어 :) 이제 내 일리노이 잘못된 프로그램 예외를 던져 찾을 수 – Earlz