我目前正在玩反射,我的短代码有问题:
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();
所以。我正在尝试在运行时创建新方法。在该方法中,我正在创建新的空测试实例。然后,我尝试将其设置为位置 (0),即 if Object 类型。然后我正在加载它并调用它的方法 Call 来获取字符串。最后,我试图将字符串结果放在屏幕上。我的代码适用于“Ldloc_0”。当调用“调用”方法时会发生错误。有谁知道如何解决这个问题?请帮忙。