나는 런타임시 내 자신의 함수를 Reflection.Emit
으로 작성하여 CIL을 배우고있다. 나는 실제로 지금까지 얼마나 쉬운 일들이 있었는지에 놀랐지 만 나는 내 방식으로는 추측 할 수없는 뭔가를 치고 문서에서 상대적인 것을 찾을 수는 없다.내 자신의 클래스 인스턴스로 DynamicMethod를 호출하면 예외가 발생하는 이유는 무엇입니까?
내가 정의한 매우 간단한 클래스를 단순히 인쇄하는 함수를 만들려고합니다. string
을 인쇄하기 위해 코드를 변경한다고해도 작동하지만, 클래스 A
클래스의 인스턴스를 전달하면 항상 실행되지 않습니다.
무엇이 이상한가요? 내 기능 본문을 주석 처리 할 수 있으며 여전히 TargetInvocationException
으로 실패합니다. 그것은 아주 간단해야하지만 나는 무엇이 일어나는지 볼 수 없다!
class A
{
public override string ToString()
{
return "AAA!";
}
}
class Program
{
static void Main(string[] args)
{
DynamicMethod func = new DynamicMethod("func", null, new Type[] { typeof(A) });
ILGenerator il = func.GetILGenerator();
//il.Emit(OpCodes.Ldarg_0);
//il.Emit(OpCodes.Box, typeof(A));
//il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(A) }));
il.Emit(OpCodes.Ret);
func.Invoke(null, new object[] { new A() });
Console.Read();
}
}
나는이 예외를 발생시킬 수 있도록 그래서 무슨 일을하고 있는가? 왜 이것이 내 수업에서만 일어나는가?
나는 당신이 게시 한대로 거의 깨달았다. 그러므로 제 대답은 같은 줄에 있습니다. 이것은 정답입니다! –
가끔 반성을 좋아해야합니다. 특히 당신이 객체 나 문자열을 시도 할 때, 당신이 합리적인 답변을 줄 수는 없으며 단지 공개이기 때문에 작동합니다. grr :) – tyranid