首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MethodInfo.Invoke TargetException

MethodInfo.Invoke TargetException
EN

Stack Overflow用户
提问于 2013-10-03 05:45:40
回答 2查看 1.1K关注 0票数 0

我对System.Reflection有一个问题,当我调用MethodInfo.Invoke方法时,它为我提供了一个TargetException异常,即:对象与目标不匹配,这里的代码如下:

代码语言:javascript
复制
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:游戏对象被正确分配,所以它不是空的

EN

回答 2

Stack Overflow用户

发布于 2013-10-03 07:00:45

乔恩说的话。

另外,如果您试图进行一些黑客活动(而不是生产级代码),下面是一些实用的建议:查看源代码(或者使用反汇编程序(如Reflector或dotPeek),看看事件是如何被调用的。

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

代码语言:javascript
复制
- If the delegate type is public, cast the value and invoke

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-10-03 05:49:30

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

如果你真的想要引发gameVideoLoader事件,那就不一样了.还有你不应该做的事。事件的目的是允许客户端订阅和取消订阅处理程序-对象本身应该负责引发事件。您可能会找到一个用于实现事件的底层字段,获取该字段的值并调用委托--但我强烈建议您不要这样做。在这一点上,你基本上违背了事件的设计。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19151656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档