Я изучаю CIL, создавая свои собственные функции во время выполнения с Reflection.Emit
. Я на самом деле удивлен тем, как легко все было до сих пор, но я наткнулся на то, через что не могу угадать и не могу найти ничего относительного в документах.
Я пытаюсь создать функцию, которая просто печатает очень простой класс, который я определил. Скажем, если я изменил свой код на печать string
s, он работает, но он всегда не запускается, когда я передаю экземпляр моего класса 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();
}
}
Что я делаю не так, чтобы сделать это исключение? Почему это происходит только с моими классами?