gpt4 book ai didi

c# - 为什么 EventInfo.RemoveEventHandler 抛出 NullReferenceException?

转载 作者:行者123 更新时间:2023-11-30 18:45:18 24 4
gpt4 key购买 nike

我有一些代码使用反射在 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 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?

关于c# - 为什么 EventInfo.RemoveEventHandler 抛出 NullReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com