現在、リフレクションで遊んでいますが、短いコードに問題があります:
public class Test
{
public Test()
{
}
public string Call()
{
string called = "Called";
return called;
}
}
そして使用法:
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.DeclareLocal(typeof(Object));
g.Emit(OpCodes.Newobj, typeof(Test).GetConstructor(Type.EmptyTypes));
g.Emit(OpCodes.Stloc, 0);
g.Emit(OpCodes.Nop);
g.Emit(OpCodes.Ldloc, 0);
g.Emit(OpCodes.Call, typeof(Test).GetMethod("Call", new Type[]{}));
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{ typeof(string) }));
g.Emit(OpCodes.Nop);
//g.Emit(OpCodes.Pop); - used in debugging
g.Emit(OpCodes.Ret);
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Console.Read();
そう。実行時に新しいメソッドを作成しようとしています。そのメソッドでは、新しい空の Test インスタンスを作成しています。次に、オブジェクトの場合のタイプであるロケーション (0) に設定しようとしています。次に、それをロードし、メソッド Call を呼び出して文字列を取得します。最後に、文字列の結果を画面に表示しようとしています。私のコードは「Ldloc_0」で動作します。「Call」メソッドが呼び出されているときにエラーが発生します。この問題を解決する方法を知っている人はいますか?助けてください。