MethodInfo.Invoke TargetException

时间:2013-10-03 05:45:41

标签: c# xna system.reflection methodinfo

我在使用System.Reflection时出现问题,当我调用MethodInfo.Invoke方法时,它会给我一个TargetException异常,它说:对象与目标不匹配,这里是代码:

object[] parms = new object[] { path };

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Type gameType = null;

foreach (Assembly asm in assemblies)
{
    string asmName = asm.GetName().Name;

    if (asmName == "Tester")
    {
        gameType = asm.GetType("Tester.Main");
        break;
    }
}

var game = Convert.ChangeType(GameInstance, gameType);
Type delegateType = game.GetType().GetEvent("gameVideoLoader").EventHandlerType;

MethodInfo method = delegateType.GetMethod("Invoke");
method.Invoke(game,  parms); // Here the exception

任何想法? PS:游戏对象被正​​确分配,所以它不是空的

2 个答案:

答案 0 :(得分:1)

您尝试调用委托的 Invoke方法,但是在Tester.Main实例上。这是错误的 - 因为Tester.Main实例不是适当委托的实例。

如果您正在尝试实际提升gameVideoLoader事件,那么这是另一回事......而且您不应该做的事情。事件的目的是允许客户订阅和取消订阅处理程序 - 对象本身应该负责引发事件。您可能能够找到用于实现事件的基础字段,获取该字段的值并调用该委托 - 但我强烈建议不要这样做。你现在基本上反对事件的设计。

答案 1 :(得分:1)

Jon说的话。

另外,如果你正在尝试做一些黑客攻击(而不是生产级别的代码),这里有一些实用的建议:看看源代码(或使用反汇编程序,如Reflector或dotPeek),看看如何调用事件。

  • 如果有一个方法调用它,请使用Reflection来调用该方法
  • 否则,如果事件使用编译器生成的字段,请使用Type.GetField检索字段(它将与事件名称相同),然后调用GetValue以获取实际的代表

    • 如果委托类型为public,则转换值并调用

      ((MyDelegate)fieldValue)(arg1, arg2...)

    • 否则,转换为Delegate并使用动态调用方法

      ((Delegate)fieldValue).DynamicInvoke(new object[] { arg1, arg2 })