如何检测我的.NET应用程序崩溃,然后重新启动它?
另一个解决方案(基于此示例)是创建一个控制应用程序的启动器:
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); } }
如果这是一个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上运行得很好.
在AppDomain中运行工作; 使用主AppDomain来监视它(但不防止进程终止)
很多异常处理!即不要让致命的错误推翻这个过程
在已经内置了回收的东西中运行它 - 例如IIS