我有一些代码使用反射在 Internet Explorer BHO 中的 MSHTML 对象上安装 .NET 事件处理程序,它似乎工作正常。但是,当我尝试删除事件处理程序时,我遇到了麻烦。
事件处理程序安装和删除的代码如下所示:
public class HandlerExample {
private static void Handler(IHTMLEventObj e) { ... }
private static Delegate handlerDelegate;
public static void InstallHandler(IHTMLElement target, string eventName)
{
// FindInterface() finds the correct event interface for the particular subclass of
// IHTMLElement that target really is
Type eventInterface = FindInterface(target);
EventInfo eInfo = eventInterface.GetEvent(eventName);
Type tHandler = eInfo.EventHandlerType;
handlerDelegate = Delegate.CreateDelegate(tHandler, typeof(HandlerExample), "Handler");
eInfo.AddEventHandler(target, handlerDelegate);
}
public static void RemoveHandler(IHTMLElement target, string eventName)
{
Type eventInterface = FindInterface(target);
EventInfo eInfo = eventInterface.GetEvent(eventName);
eInfo.RemoveEventHandler(target, handlerDelegate); // THIS LINE CRASHES
}
}
调用InstallEventHandler
工作正常,Handler
然后在浏览器中触发事件时调用。当我RemoveEventHandler
使用与调用相同的参数进行InstallEventHandler
调用时,最后一行抛出 a TargetInvocationException
,内部异常为NullReferenceException
。我无法弄清楚我在这里做错了什么,堆栈跟踪也没有多大帮助。
编辑:我已经通过调试器中的代码,我直接引用的对象变量都不是空的。
我也尝试在 InstallHandler 方法中调用AddEventHandler
和调用RemoveEventHandler
,并且工作正常。
堆栈跟踪如下:
System.Reflection.TargetInvocationException 发生 Message="调用的目标已抛出异常。" 来源="mscorlib" 堆栈跟踪: 在 System.RuntimeMethodHandle._InvokeMethodFast(对象目标,Object[] 参数,SignatureStruct& sig,MethodAttributes methodAttributes,RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle.InvokeMethodFast(对象目标,对象 [] 参数,签名 sig,MethodAttributes 方法属性,RuntimeTypeHandle typeOwner) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化,布尔型 skipVisibilityChecks) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 System.Reflection.EventInfo.RemoveEventHandler(对象目标,委托处理程序) 在 RemoveHandler(IHTMLElement 目标,字符串事件名称) 内部异常:System.NullReferenceException Message="对象引用未设置为对象的实例。" 来源="Microsoft.mshtml" 堆栈跟踪: 在 mshtml.HTMLTextContainerEvents2_EventProvider.remove_onclick(HTMLTextContainerEvents2_onclickEventHandler ) 在 mshtml.HTMLTextAreaElementClass.HTMLTextContainerEvents2_Event_remove_onclick(HTMLTextContainerEvents2_onclickEventHandler) 内部异常:
这可能是什么原因造成的,我该如何解决?