3

我有一些代码使用反射在 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)
       内部异常:

这可能是什么原因造成的,我该如何解决?

4

1 回答 1

0

好吧,当您调用 RemoveHandler 时,看起来您的 handlerDelegate 为空。我不确定为什么会发生这种情况,但是您是否尝试过在调用 RemoveEventHandler 之前实例化 handlerDelegate?

于 2008-12-16T16:57:33.737 回答