C# WinAPI CloseEvent引发空指针异常
我开发了一个应用程序,它执行一些操作,比如在关闭应用程序事件时恢复网络适配器设置。该应用程序是用Win7 64位下的c#4.0编写的,它使用WinAPI捕捉“控制台关闭事件”。C# WinAPI CloseEvent引发空指针异常,c#,.net,winapi,console,C#,.net,Winapi,Console,我开发了一个应用程序,它执行一些操作,比如在关闭应用程序事件时恢复网络适配器设置。该应用程序是用Win7 64位下的c#4.0编写的,它使用WinAPI捕捉“控制台关闭事件”。 应用程序正在抛出“未知模块中发生了类型为'System.NullReferenceException'的未处理异常”。当我关闭它时,我认为这是因为在关闭控制台事件中,我执行了一些操作。使用setConsoleCtrlHandler,我们可以捕获“关闭控制台应用程序”事件,我们有大约1-2秒的时间窗口来执行操作,但有时这
应用程序正在抛出“未知模块中发生了类型为'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您将委托传递给非托管代码,但不采取任何步骤使该委托保持活动状态。就垃圾收集器所知,只要
SetConsoleCtrlHandler
返回,就不再有对委托的引用。代表没有理由让它继续存在
您应该在静态变量中保留对委托的引用,以防止它被收集。请显示更多代码。请显示对
setConsoletrlHandler
的调用。我希望看到您持有对该代理的引用,以阻止其被收集。我添加了其他详细信息,thxApps可以因miriad原因终止,而没有机会进行清理。进行诸如更改网络适配器和期望在退出时进行清理之类的操作是非常值得怀疑的。Windows有一个功能,它更可能执行您想执行的任何操作。我正在考虑使用一个单独的应用程序来监视进程,并在特定进程关闭时执行所有这些网络适配器设置,但首先我要确保我不能在同一个应用程序中执行。您能否更具体地介绍一下过滤平台,以及它如何帮助我解决这个问题(当关闭应用程序时,请执行一些计算…),从这里我可以看到它指的是TCP/IP数据包过滤。谢谢