如何检测我的.NET应用程序已崩溃,然后重新启动它?
答案 0 :(得分:14)
另一种解决方案(基于this example)是创建一个控制应用程序的启动器:
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);
}
}
答案 1 :(得分:8)
如果这是Windows窗体应用程序:
现在无论是Windows窗体应用程序还是控制台应用程序:
注册 Application.ThreadException 事件,例如在C#中:
Application.ThreadException + = new Threading.ThreadExceptionHandler(CatchFatalException);
此时,您的应用已经进入黑洞。接下来会发生什么取决于这是否是Windows窗体应用程序:
答案 2 :(得分:5)
答案 3 :(得分:1)
一种可能的解决方案是创建另一个进程来监视您的应用程序,并在终止时重新启动它:
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);
}
}
此解决方案的一个问题是它将使进程永远重启,直到此监视应用程序本身终止。