2009-09-10 4 views
3

나는 제네릭 메서드가있는 제네릭 형식 (계약서 작성)을 동적으로 하위 클래스로 분류하고 있습니다. 이 일반적인 메서드를 호출하려고하지만 내가 생성하는 어셈블리에 오류가 있습니다. 어셈블리를 열려고 할 때 리플렉터가 충돌하고이 코드 조각이 실행되지 않습니다.Reflection.Emit 일반 기본 클래스 일반 메서드 호출

내가 얻을 예외입니다 :

시도가 잘못된 형식의 프로그램을로드하려고했습니다. (HRESULT 예외 : 0x8007000B)

어떤 도움을 주시면 감사하겠습니다. PEVerify를 설치하여 생성 된 코드를 살펴 보겠습니다. testClass 오픈 제네릭 클래스 유형입니다

var testGeneric = testClassOfObject 
    .GetMethod("TestMethod") 
    .MakeGenericMethod(typeof(int)); 

때문에 당신이 방법을 호출 할 경우 충돌 것 대신의

using System; 
using System.Reflection; 
using System.Reflection.Emit; 

public class TestClass<TFirst> 
{ 
    public void TestMethod<TSecond>() 
    { 
     Console.WriteLine("It works"); 
    } 
} 
public class Program 
{ 
    static void Main(string[] args) 
    { 
     // create a dynamic assembly and module 
     var assemblyName = new AssemblyName("DynamicAssembly"); 
     var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); 
     var module = assemblyBuilder.DefineDynamicModule("DynamicAssembly.dll"); 

     // public class Voodoo.Dynamic.Class : TestClass<object> 
     var testClass = typeof(TestClass<>); 
     var testClassOfObject = testClass.MakeGenericType(typeof(object)); 
     var typeBuilder = module.DefineType(
      "Voodoo.Dynamic.Class", 
      TypeAttributes.Public | TypeAttributes.Class, 
      testClassOfObject); 

     // public void Run() 
     var methodBuilder = typeBuilder.DefineMethod("Run", MethodAttributes.Public); 

     // this.TestMethod<int>(); 
     var testGeneric = testClass.GetMethod("TestMethod").MakeGenericMethod(typeof(int)); 
     var il = methodBuilder.GetILGenerator(); 
     il.Emit(OpCodes.Ldarg_0); // load this 
     il.Emit(OpCodes.Call, testGeneric); 
     il.Emit(OpCodes.Ret); 

     // bake it 
     var classType = typeBuilder.CreateType(); 

     assemblyBuilder.Save("DynamicAssembly.dll"); 

     // var instance = new Voodoo.Dynamic.Class(); 
     var instance = Activator.CreateInstance(classType); 

     // instance.Run(); 
     classType.GetMethod("Run").Invoke(instance, new object[] { }); 
    } 
} 

답변

6

:

var testGeneric = testClass 
    .GetMethod("TestMethod") 
    .MakeGenericMethod(typeof(int)); 

당신이 필요합니다.

+0

건배,이 대답은 제가 가지고있는 더 복잡한 문제를 해결하도록 이끌었습니다. 프로젝트는 여전히 작동하지 않지만 훨씬 더 가깝습니다. –