2008-12-16 100 views
3

我已经有一些代码使用反射来安装Internet Explorer BHO中的MSHTML对象的.NET事件处理程序,它似乎工作正常。但是,当我尝试删除事件处理程序时,我遇到了麻烦。为什么EventInfo.RemoveEventHandler抛出NullReferenceException?

这是做什么用的事件处理程序的安装和拆卸的代码如下所示:

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的电话号码相同时,最后一行输出TargetInvocationException,内部例外情况为NullReferenceException。我无法弄清楚我在这里做错了什么,并且堆栈跟踪没有多大帮助。

编辑:我已经遍历调试器中的代码,并且没有任何我直接引用的对象变量为空。

我也尝试在InstallHandler方法中调用AddEventHandlerRemoveEventHandler,并且该方法正常工作。

堆栈跟踪如下:

System.Reflection.TargetInvocationException occurred 
    Message="Exception has been thrown by the target of an invocation." 
    Source="mscorlib" 
    StackTrace: 
     at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
     at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
     at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
     at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
     at System.Reflection.EventInfo.RemoveEventHandler(Object target, Delegate handler) 
     at RemoveHandler(IHTMLElement target, String eventName) 
    InnerException: System.NullReferenceException 
     Message="Object reference not set to an instance of an object." 
     Source="Microsoft.mshtml" 
     StackTrace: 
      at mshtml.HTMLTextContainerEvents2_EventProvider.remove_onclick(HTMLTextContainerEvents2_onclickEventHandler) 
      at mshtml.HTMLTextAreaElementClass.HTMLTextContainerEvents2_Event_remove_onclick(HTMLTextContainerEvents2_onclickEventHandler) 
     InnerException:

什么可能会造成这一点,我怎么能解决这个问题?

回答

0

当你调用RemoveHandler时,它看起来像你的handlerDelegate为null。 我不知道为什么会发生这种情况,但是您在调用RemoveEventHandler之前是否尝试过实例化handlerDelegate?

+0

我已经完成了调试器中的代码,并且在调用RemoveEventHandler时handlerDelegate不为null。我已经更新了这个问题来反映这一点。 – Greg 2008-12-17 15:06:56

相关问题