이것은 명백한 것처럼 들리지만 많은 어려움을 겪고 있습니다. 기본적으로, 내가하고있는 일은 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
훨씬 더 나은 선택을 작성하는 경우
DynamicMethod를 처음부터 고려하지 않은 이유가 확실하지 않습니다. 그게 효과가 있는지 알게 될 것입니다. (단위 테스팅을 위해서만 쓰일 수 있습니다. 따라서 수집하기가 매우 중요하지 않지만, 사용하기가 더 쉽습니다.) – Earlz
@Earlz ** 많이 ** 쉽습니다. AssemblyBuilder, ModuleBuilder, AssemblyName, TypeBuilder , MethodBuilder - 기본적으로 ILGenerator. –
네, 그냥 약 2 초 DynamicMethod를 사용하여 변환이 모든 고정있어 :) 이제 내 일리노이 잘못된 프로그램 예외를 던져 찾을 수 – Earlz