检测并重新启动崩溃的.NET应用程序

检测并重新启动崩溃的.NET应用程序,.net,.net,如何检测到我的.NET应用程序已崩溃,然后重新启动它?一种可能的解决方案是创建另一个进程来监视你的应用程序,并在应用程序终止时重新启动它: class ProcessMonitorProgram { const string myProcess = "MyApp.exe"; static void Main() { new Timer(CheckProcess, null, 0, 60 * 1000); Thread.Sleep(Time

如何检测到我的.NET应用程序已崩溃,然后重新启动它?

一种可能的解决方案是创建另一个进程来监视你的应用程序,并在应用程序终止时重新启动它:

class ProcessMonitorProgram
{
    const string myProcess = "MyApp.exe";

    static void Main()
    {
        new Timer(CheckProcess, null, 0, 60 * 1000);
        Thread.Sleep(Timeout.Infinite);
    }

    static void CheckProcess(object obj)
    {
        if (Process.GetProcessesByName(myProcess).Length == 0)
            Process.Start(myProcess);
    }
}
此解决方案的一个问题是,它将使进程永远重新启动,直到此监控应用程序本身终止。

另一个解决方案(基于)是创建一个控制应用程序的启动器:

class LauncherProgram
{
    static int count = 3;

    static void Main()
    {
        Launch();
        Thread.Sleep(Timeout.Infinite);
    }

    static void Launch()
    {
        Process process = new Process();
        process.StartInfo.FileName = "MyApp.exe";
        process.EnableRaisingEvents = true;
        process.Exited += LaunchIfCrashed;
    }

    static void LaunchIfCrashed(object o, EventArgs e)
    {
        Process process = (Process) o;
        if (process.ExitCode != 0)
        {
            if (count-- > 0) // restart at max count times
                Launch();
            else
                Environment.Exit(process.ExitCode);
        }
        else
        {
            Environment.Exit(0);
        }
    }
  • 在AppDomain中运行工作;使用主AppDomain对其进行监视(但不防止进程终止)
  • 大量的异常处理!i、 e.不要让致命错误破坏流程
  • 在已经内置了回收的东西中运行它,例如IIS

如果这是Windows窗体应用程序:

  • 在App.Config中设置jitdebug=true。这将防止触发内置的Windows窗体未经处理的异常处理程序
现在,无论这是Windows窗体应用程序还是控制台应用程序:

  • 注册应用程序。ThreadException事件,例如在C#中:

    Application.ThreadException+=new Threading.ThreadExceptionHandler(CatchFatalException)

此时,你的应用程序已经进入了一个黑洞。接下来会发生什么取决于这是否是Windows窗体应用程序:

  • 如果是Windows窗体应用程序,请在CatchFatalException事件处理程序中调用该方法
  • 否则,您将需要对本机函数进行p/invoke。该链接讨论了Vista,但在我的测试中,它在XP上也可以正常工作

我找到了这个问题的一些解决方案(在我提问之前),所以我想如果能在这么短的时间内找到答案就好了。如果你还有其他答案,请随意回答。或者投票选出最佳答案来指导他人。另外,请在您认为合适的情况下重新标记此问题。添加了有关重新启动控制台应用程序的信息,因为这显然是您正在使用的。谢谢Marc。您能否添加一个示例,说明如何实施您建议的基于AppDomain的解决方案?假设这是一个Windows窗体或控制台应用程序,您可以使用应用程序。重新启动-有关详细信息,请参阅我的答案。唯一可能的升级是使“watchdog”windows服务。最好添加一些时间戳代码并检测应用程序是否在Startupbook上崩溃谢谢。控制台应用程序是否可以执行类似于
application.ThreadException+=MyHandler的操作?是的,控制台应用程序也可以这样做。但它没有访问应用程序类的权限,是吗?如果添加正确的命名空间,它确实有访问应用程序类的权限。但在我的测试中,我看到一个“不受支持”的异常,所以你是对的,这不适用于控制台应用程序。我将改变我的答案以反映这一点。