2014-02-14 1 views
0

와 일반적인 기본 메소드를 호출하는 방법 :나는 다음과 같은 클래스가하는 TypeBuilder

public abstract class BaseClass 
{ 
    protected TOutput Convert<TInput, TOutput>(TInput input) 
    { 
     return (TOutput)System.Convert.ChangeType(input, typeof(TOutput)); 
    } 
} 

을 (참고로 필자는 기본 클래스를 편집 할 수 없습니다) 그리고 제가 구축을 위해 노력하고있어, 동적 유형 같은 :

public class DynamicClass : BaseClass 
{ 
    public string Convert(int value) 
    { 
     return base.Convert<int, string>(value); 
    } 
} 

내가 동적 유형을 구축하는 데 사용하는 방법, 다음과 같습니다

private MethodBuilder BuildConvertMethod(TypeBuilder typeBuilder) 
{ 
    var baseConvertMethod = typeof(BaseClass).GetMethod("Convert", BindingFlags.NonPublic | BindingFlags.CreateInstance | BindingFlags.Instance); 
    var baseConvertMethodInstance = baseConvertMethod.MakeGenericMethod(typeof(int), typeof(string)); 

    var convertMethodBuilder = typeBuilder.DefineMethod("Convert", MethodAttributes.Public, typeof(string), new[] { typeof(int) }); 

    var convertMethodILGenerator = convertMethodBuilder.GetILGenerator(); 
    convertMethodILGenerator.Emit(OpCodes.Nop); 
    convertMethodILGenerator.Emit(OpCodes.Ldarg_0); 
    convertMethodILGenerator.Emit(OpCodes.Ldarg_1); 
    convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance); 
    convertMethodILGenerator.Emit(OpCodes.Ldloc_0); 
    convertMethodILGenerator.Emit(OpCodes.Ret); 

    return convertMethodBuilder; 
} 

유형 SUCC의 생성 eeds. 하지만 DynamicClass의 인스턴스를 생성 한 다음, 나는 다음과 같은 예외가 얻을 변환 메서드를 호출 할 때

System.Reflection.TargetInvocationException : 호출 대상이 예외가 발생되었습니다. ----> System.InvalidProgramException : 공용 언어 런타임에서 잘못된 프로그램을 감지했습니다.

누군가가이 문제에 대해 도움을 주시겠습니까?

답변

0

Call 명령어는 스택에서 반환 값을 푸시하여 Ret을 바로 호출 할 수 있도록합니다.

var convertMethodILGenerator = convertMethodBuilder.GetILGenerator(); 
convertMethodILGenerator.Emit(OpCodes.Ldarg_0); 
convertMethodILGenerator.Emit(OpCodes.Ldarg_1); 
convertMethodILGenerator.Emit(OpCodes.Call, baseConvertMethodInstance); 
convertMethodILGenerator.Emit(OpCodes.Ret); 
+0

고마워요. 바로 작동했습니다. :-) –