[英]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.