C # .NET 2.0 WinForm 응용 프로그램 개발. 응용 프로그램을 닫고 자체적으로 다시 시작해야합니다.
Application.Restart();
위의 방법은 신뢰할 수없는 것으로 입증되었습니다 .
응용 프로그램을 다시 시작하는 더 좋은 방법은 무엇입니까?
답변
불행히도 Process.Start ()를 사용하여 현재 실행중인 프로세스의 인스턴스를 시작할 수 없습니다. Process.Start () 문서에 따르면 “프로세스가 이미 실행 중이면 추가 프로세스 리소스가 시작되지 않습니다 …”
이 기술은 VS 디버거에서 잘 작동하지만 (VS는 Process.Start가 프로세스가 아직 실행 중이 아니라고 생각하게하는 일종의 마법을 수행하기 때문에) 디버거에서 실행되지 않으면 실패합니다. (이것은 OS에 따라 다를 수 있습니다. 일부 테스트에서는 XP 또는 Vista에서 작동했지만 디버거에서 실행 한 것을 기억하고있을 수 있습니다.)
이 기술은 제가 현재 작업하고있는 프로젝트의 마지막 프로그래머가 사용한 것과 정확히 일치하며 꽤 오랫동안 이에 대한 해결 방법을 찾으려고 노력해 왔습니다. 지금까지 한 가지 해결책 만 찾았는데, 그저 더럽고 칙칙한 느낌이 듭니다. 첫 번째 애플리케이션이 종료 될 때까지 백그라운드에서 대기하는 두 번째 애플리케이션을 시작한 다음 첫 번째 애플리케이션을 다시 시작합니다. 나는 그것이 작동 할 것이라고 확신하지만, 쉿.
편집 : 두 번째 응용 프로그램을 사용하면 작동합니다. 두 번째 앱에서 제가 한 것은 다음과 같습니다.
static void RestartApp(int pid, string applicationName )
{
// Wait for the process to terminate
Process process = null;
try
{
process = Process.GetProcessById(pid);
process.WaitForExit(1000);
}
catch (ArgumentException ex)
{
// ArgumentException to indicate that the
// process doesn't exist? LAME!!
}
Process.Start(applicationName, "");
}
(이것은 매우 간단한 예제입니다. 실제 코드에는 온 전성 검사, 오류 처리 등이 많이 있습니다.)
답변
나를 위해 일한 훨씬 간단한 접근 방식은 다음과 같습니다.
Application.Restart();
Environment.Exit(0);
이렇게하면 명령 줄 인수가 유지되고 일반적으로 응용 프로그램이 닫히지 않도록하는 이벤트 처리기가 있더라도 작동합니다.
Restart () 호출은 종료를 시도하고 어쨌든 새 인스턴스를 시작하고 반환합니다. 그런 다음 Exit () 호출은 이벤트 처리기에 실행할 기회를주지 않고 프로세스를 종료합니다. 두 프로세스가 모두 실행되는 매우 짧은 기간이 있습니다. 제 경우에는 문제가되지 않지만 다른 경우에는 가능합니다.
종료 코드 0 입력은 Environment.Exit(0);
완전 종료 를 지정합니다. 1로 종료하여 오류가 발생했음을 지정할 수도 있습니다.
답변
메인 앱 형태라면 사용 해보세요
System.Diagnostics.Process.Start( Application.ExecutablePath); // to start new instance of application
this.Close(); //to turn off current app
답변
나는 파티에 늦을 수도 있지만 여기에 내 간단한 해결책이 있으며 내가 가진 모든 응용 프로그램에서 매력처럼 작동합니다.
try
{
//run the program again and close this one
Process.Start(Application.StartupPath + "\\blabla.exe");
//or you can use Application.ExecutablePath
//close this one
Process.GetCurrentProcess().Kill();
}
catch
{ }
답변
저도 똑같은 문제를 겪었고 중복 인스턴스를 방지해야한다는 요구 사항도있었습니다. HiredMind가 제안한 대안에 대한 대안을 제안합니다 (잘 작동합니다).
내가하고있는 일은 이전 프로세스 (다시 시작을 트리거하는 프로세스)의 processId를 cmd 줄 인수로 사용하여 새 프로세스를 시작하는 것입니다.
// Shut down the current app instance.
Application.Exit();
// Restart the app passing "/restart [processId]" as cmd line args
Process.Start(Application.ExecutablePath, "/restart" + Process.GetCurrentProcess().Id);
그런 다음 새 앱이 시작되면 먼저 cm 행 인수를 구문 분석하고 processId와 함께 다시 시작 플래그가 있는지 확인한 다음 해당 프로세스가 종료 될 때까지 기다립니다.
if (_isRestart)
{
try
{
// get old process and wait UP TO 5 secs then give up!
Process oldProcess = Process.GetProcessById(_restartProcessId);
oldProcess.WaitForExit(5000);
}
catch (Exception ex)
{
// the process did not exist - probably already closed!
//TODO: --> LOG
}
}
나는 내가 가지고있는 모든 안전 점검 등을 분명히 보여주지 않고있다.
이상적이지 않더라도-나는 이것이 유효한 대안이라고 생각하므로 다시 시작을 처리하기 위해 별도의 앱을 배치 할 필요가 없습니다.
답변
시작 / 종료 방법
// Get the parameters/arguments passed to program if any
string arguments = string.Empty;
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++) // args[0] is always exe path/filename
arguments += args[i] + " ";
// Restart current application, with same arguments/parameters
Application.Exit();
System.Diagnostics.Process.Start(Application.ExecutablePath, arguments);
이것은 Application.Restart ();보다 잘 작동하는 것 같습니다.
프로그램이 다중 인스턴스로부터 보호하는 경우 이것이 어떻게 처리되는지 확실하지 않습니다. 제 생각에는 두 번째 .exe를 실행하는 것이 더 나을 것입니다.
답변
간단합니다 Application.Restart()
. 다시 시작하기 위해 응용 프로그램을 호출하는 경향이 있는 메서드를 호출하면됩니다. 그러나 오류 코드를 사용하여 로컬 환경을 종료해야합니다.
Application.Restart();
Environment.exit(int errorcode);
효율적으로 사용할 수 있도록 오류 코드 열거를 만들 수 있습니다.
또 다른 방법은 응용 프로그램을 종료하고 실행 경로가있는 프로세스를 시작하는 것입니다.
Application.exit();
System.Diagnostics.Process.Start(Application.ExecutablePath);