【问题标题】:Why is EventInfo.RemoveEventHandler throwing a NullReferenceException?为什么 EventInfo.RemoveEventHandler 会抛出 NullReferenceException?
【发布时间】:2010-09-27 04:01:33
【问题描述】:

我有一些代码使用反射在 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。当我使用与InstallEventHandler 调用相同的参数调用RemoveEventHandler 时,最后一行抛出TargetInvocationException,内部异常为NullReferenceException。我无法弄清楚我在这里做错了什么,堆栈跟踪也没有多大帮助。

编辑:我已经在调试器中单步执行了代码,我直接引用的对象变量都不是空的。

我也尝试在 InstallHandler 方法中同时调用 AddEventHandlerRemoveEventHandler,并且效果正常。

堆栈跟踪如下:

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)
       内部异常:

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

【问题讨论】:

    标签: c# .net reflection mshtml


    【解决方案1】:

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

    【讨论】:

    • 我已经在调试器中单步执行了代码,当我调用 RemoveEventHandler 时 handlerDelegate 不为空。我已更新问题以反映这一点。
    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多