で実行時に独自の関数を作成して CIL を学習していますReflection.Emit
。今までのやり方がいかに簡単だったかには実際に驚いていますが、自分のやり方を推測できない何かにぶつかり、ドキュメントに関連するものは何も見つかりません。
定義した非常に単純なクラスを単純に出力する関数を作成しようとしています。たとえば、コードを print string
s に変更すると動作しますが、 class のインスタンスを渡すと常に実行に失敗します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();
}
}
これを例外として発生させるには、何が間違っているのでしょうか? これが私のクラスでのみ発生するのはなぜですか?