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

Hos*_*Aly 11 .net

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

Hos*_*Aly 14

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

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)


Roa*_*ior 8

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

  • App.Config中设置jitDebugging = true.这可以防止触发内置的Windows窗体未处理的异常处理程序.

现在无论这是Windows窗体应用程序还是控制台应用程序:

  • 注册Application.ThreadException事件,例如在C#中:

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

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

  • 如果它是Windows窗体应用程序,请在CatchFatalException事件处理程序中调用Application.Restart方法.
  • 否则,您将需要p/invoke到应用程序重新启动和恢复本机功能.该链接讨论了Vista,但在我的测试中,它在XP上运行得很好.


Mar*_*ell 5

  • 在AppDomain中运行工作; 使用主AppDomain来监视它(但不防止进程终止)
  • 很多异常处理!即不要让致命的错误推翻这个过程
  • 在已经内置了回收的东西中运行它 - 例如IIS