C# 如何防止“显示”;“程序意外终止”;窗户?

C# 如何防止“显示”;“程序意外终止”;窗户?,c#,.net,windows,C#,.net,Windows,我有一个使用AciveX对象并提供WCF服务的C#WPF程序。因此有许多线程,许多对非托管代码的调用。有时在满负荷情况下应用程序崩溃。我正在调查这个问题——看起来问题在ActiveX中的某个地方,我无法更改。无论如何,我需要一种方法来恢复程序崩溃后。到目前为止,我已经找到了解决办法: public partial class App : Application { private static readonly Logger log = LogManager.GetCurrentCla

我有一个使用AciveX对象并提供WCF服务的C#WPF程序。因此有许多线程,许多对非托管代码的调用。有时在满负荷情况下应用程序崩溃。我正在调查这个问题——看起来问题在ActiveX中的某个地方,我无法更改。无论如何,我需要一种方法来恢复程序崩溃后。到目前为止,我已经找到了解决办法:

public partial class App : Application
 {
    private static readonly Logger log = LogManager.GetCurrentClassLogger();

    bool isClosing = false;


    [System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute]
    void D_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        log.FatalException("Error UnhandledException ", (Exception)e.ExceptionObject);
        MonitoringSvc.host.Close();
        log.Info("Restarting");
        if (!isClosing)
        {

            System.Windows.Forms.Application.Restart();
            System.Windows.Application.Current.Shutdown();
        }
    }


    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain D = AppDomain.CurrentDomain;
        D.UnhandledException += new UnhandledExceptionEventHandler(D_UnhandledException);
    }

    private void Application_Exit(object sender, ExitEventArgs e)
    {
        isClosing = true;
    }
}

程序在未处理的异常情况下重新启动(当然是在模拟的异常情况下)。但旧副本未关闭,系统消息为“程序意外终止”。程序大部分时间不会与用户交互,因此没有人可以关闭该消息来关闭程序。问题是如何以静默方式关闭旧窗口?

以下是如何禁用程序崩溃时出现的窗口的解决方案。不仅是WER,因为即使禁用WER,也会显示其他窗口(请求关闭或调试程序)


该属性还不够,还需要[SecurityCritical]。或者使用app.exe.config文件中的
元素。仍然不能保证,CLR无法捕获由本机代码启动的线程中的硬异常。您需要为此进程禁用WER。请访问superuser.com。这种绷带是个坏兔子洞。也许写一个简单的守护程序更好。当主进程停止响应某些看门狗消息时,它可能会终止主进程。并在意外退出时重新启动。我不确定WER-它会应用于子进程吗?我已经找到了SetErrorMode函数加上另外一个技巧的解决方案。我稍后会发布它。哦,我刚刚发现了一件有趣的事情:事实上,传递给SetUnhandledExceptionFilter的委托没有被调用。我认为这是因为SetUnhandledExceptionFilter需要指向本机函数的指针,而不是.NET委托。我们只需传递(IntPtr)0,其效果将是相同的:异常将被静默忽略。但是,如果我们真的想用out托管函数处理异常,我们应该将其放入Dll中,然后检索其地址,然后将其交给SetUnhandledExceptionFilter。不过我还没试过。
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern int SetErrorMode(int wMode);

    [DllImport("kernel32.dll")]
    static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
    public delegate bool FilterDelegate(Exception ex);

    App()
    {
        FilterDelegate fd = delegate(Exception ex)
        {
            return true;
        };
        SetUnhandledExceptionFilter(fd);

        SetErrorMode(SetErrorMode(0) | 0x0002 );
    }