以我的经验,只有在连接调试器的情况下才能看到此问题。独立运行时,该应用程序的行为相同:不会吞下该异常。
通过引入KB976038,您可以再次实现预期的工作。我从未安装过此修补程序,因此我假设它是Win7 SP1的一部分。
在这篇文章中提到了这一点:
这是一些将启用此修复程序的代码:
public static class Kernel32
{
public const uint PROCESS_CALLBACK_FILTER_ENABLED = 0x1;
[DllImport("Kernel32.dll")]
public static extern bool SetProcessUserModeExceptionPolicy(UInt32 dwFlags);
[DllImport("Kernel32.dll")]
public static extern bool GetProcessUserModeExceptionPolicy(out UInt32 lpFlags);
public static void DisableUMCallbackFilter() {
uint flags;
GetProcessUserModeExceptionPolicy(out flags);
flags &= ~PROCESS_CALLBACK_FILTER_ENABLED;
SetProcessUserModeExceptionPolicy(flags);
}
}
在应用程序开始时调用它:
[STAThread]
static void Main()
{
Kernel32.DisableUMCallbackFilter();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
正如您所期望的,我已经确认(通过下面显示的简单示例)它可以工作。
protected override void OnLoad(EventArgs e) {
throw new Exception("BOOM");
}
所以,我不明白的是,为什么调试器以前不可能处理交叉的内核模式堆栈帧,但是有了此修补程序,他们以某种方式弄清楚了。