为什么EventInfo.RemoveEventHandler抛出NullReferenceException?
问题描述:
我已经有一些代码使用反射来安装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方法中调用AddEventHandler
和RemoveEventHandler
,并且该方法正常工作。
堆栈跟踪如下:
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:
什么可能会造成这一点,我怎么能解决这个问题?
答
当你调用RemoveHandler时,它看起来像你的handlerDelegate为null。 我不知道为什么会发生这种情况,但是您在调用RemoveEventHandler之前是否尝试过实例化handlerDelegate?
我已经完成了调试器中的代码,并且在调用RemoveEventHandler时handlerDelegate不为null。我已经更新了这个问题来反映这一点。 – Greg 2008-12-17 15:06:56