WinAPI CloseEvent引发NULL指针异常

本文关键字:指针 异常 NULL 引发 CloseEvent WinAPI | 更新日期: 2023-09-27 18:28:06

我开发了一个应用程序,它可以执行一些操作,如在关闭应用程序事件时恢复网络适配器设置。该应用程序是在win7 64位下用c#4.0编写的,它使用WinAPI来捕捉"控制台关闭事件"。
该应用程序正在抛出"未知模块中发生类型为System.NullReferenceException的未处理异常。"当我关闭它时,在我看来,这是由于在关闭控制台事件中我执行了一些操作。使用setConsoleCtrlHandler,我们可以捕捉"关闭控制台应用程序"事件,我们有大约1-2秒的时间窗口来执行操作,但有时这1-2秒不足以完成我在该方法中所要做的所有操作。该方法只需不到1秒即可完成。这是我用来捕捉关闭事件的代码,以及触发事件时我正在执行的操作:

//WinAPI method that catches the close event
static class NativeMethods
{
    public delegate bool HandlerRoutine(CtrlTypes CtrlType);
    // An enumerated type for the control messages
    // sent to the handler routine.
    public enum CtrlTypes
    {
        CTRL_C_EVENT = 0,
        CTRL_BREAK_EVENT,
        CTRL_CLOSE_EVENT,
        CTRL_LOGOFF_EVENT = 5,
        CTRL_SHUTDOWN_EVENT
    }
    [DllImport("Kernel32")]
    public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);
    public static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
    {
        // Put your own handler here
        switch (ctrlType)
        {
            case CtrlTypes.CTRL_CLOSE_EVENT:
                Console.WriteLine("Program being closed!");
                try
                {
                    //do stuff
                }
                catch(Exception ex)
                {
                    Console.WriteLine("FAILED");
                }
                break;
        }
        return true;
    }
}
//In Program.cs I register to catch the window events:
NativeMethods.SetConsoleCtrlHandler(new NativeMethods.HandlerRoutine(NativeMethods.ConsoleCtrlCheck), true);

你知道我应该如何避免这个问题并在应用程序关闭之前执行所需的方法吗
Thx

WinAPI CloseEvent引发NULL指针异常

将委托传递给非托管代码,但不采取任何步骤来保持该委托的有效性。据垃圾收集器所知,一旦SetConsoleCtrlHandler返回,就不再有对委托的引用。代理没有理由让它活着。

您应该在静态变量中保留对委托的引用,以防止其被收集。