繁体   English   中英

MethodInfo.Invoke TargetException

[英]MethodInfo.Invoke TargetException

我遇到了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:游戏对象已正确分配,因此不为null

您正在尝试在Tester.Main实例上Invoke 委托的 Invoke方法。 那是错误的-因为Tester.Main实例不是适当委托的实例。

如果您实际上是在尝试引发gameVideoLoader事件,那将是另一回事...而且无论如何您都不应该这样做。 事件的目的是允许客户端订阅和取消订阅处理程序-对象本身应负责引发事件。 也许可以找到用于实现事件的基础字段,获取该字段的值并调用委托-但我强烈建议不要这样做。 此时,您基本上违背了事件的设计。

乔恩说了什么。

另外,如果您尝试进行一些黑客攻击(而不是生产级代码),请参考以下实用建议:查看源代码(或使用反汇编程序,如Reflector或dotPeek),然后查看事件的调用方式。

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

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

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

    • 否则,强制转换为Delegate并使用动态invoke方法

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM