2010-06-16 5 views
2

WPF에서 응용 프로그램을 다시 시작하려고합니다.WPF에서 프로세스를 예약하는 방법.

Process.Start(Application.ExecutablePath); 
Process.GetCurrentProcess().Kill(); 

그리고 응용 프로그램이 단일 인스턴스 응용 프로그램으로 설정이기 때문에 작동하지 않습니다

나는 다음 시도했다.

그럼 피곤이 :

Process.GetCurrentProcess().Kill(); 
Process.Start(Application.ExecutablePath); 

그리고 우리가 라인 2

을 공격하지 않습니다 프로세스를 종료하면이 때문에 작동하지 않도록 상기 .Start을 예약 할 수있는 방법이 있나요 나는 문제 # 1에 부딪치지 않는다.

+2

많은 살인 - 자살 사례가 있으며, 두 번째 시도는 자살 살인 사건이없는 이유를 설명합니다. – SWeko

답변

2

지연 후 주 프로그램을 다시 시작하는 보조 응용 프로그램을 시작할 수 있습니다. 몇 년 전에 자체 업데이터를 만들었을 때, 필자가 취한 구현 경로였습니다. 실행 파일을 명령 행 인수로 사용하고 잠깐 10 분 동안 잠을 자면 간단한 프로그램이었습니다.

새로 도입 된 프로그램은 종료 된 프로세스를 기다리는 것이 더 나은 구현 경로입니다. 시간의 임의의 길이를 기다리는 것은 문제를 복잡하게 할 수 있습니다. 이것을 성취하기 위해서, 나는 프로세스 ID를 재발 기자에게 전달하여 어떤 프로세스가 기다려야하는지 정확히 알 수 있도록 할 것이다.

+0

이전 프로세스가 임의의 시간 (응용 프로그램을 종료하는 데 충분하지 않을 수도 있음)을 기다리지 않고 종료 될 때까지 기다려야합니다. 특히 정리가 몇 페이지 폴트를 치는 경우 응용 프로그램을 종료하면 원래 예상보다 오래 걸릴 수 있습니다. – Joey

+0

그건 중요한 지적입니다. 당신이 제안한대로 더 나은 해결책은 모니터링을 할 것입니다. – JustLoren

+0

제안 해 주셔서 감사합니다. 나는이 해결책을 잠시 전에 보았지만 이것은 더러워 보인다. 그러나 "재시동"프로그램을 쓰지 않고 그것을 할 수있는 좋은 방법이 없다고 생각합니다. –

2

생각만큼 어렵지 않습니다.

public static void RestartMe(string commandLine) 
{ 
    var myId = Process.GetCurrentProcess().Id; 
    var myPath = Assembly.GetEntryAssembly().CodeBase.Replace("file:///", ""); 
    var systemPath = typeof(object).Assembly.CodeBase.Replace("file:///", ""); 

    var tempPath = Path.GetTempFileName(); 

    File.WriteAllText(tempPath + ".cs", @" 
    using System; 
    using System.Diagnostics; 
    public class App 
    { 
     public static void Main(string[] args) 
     { 
     try { Process.GetProcessById(" + myId + @").WaitForExit(); } catch {} 
     Process.Start(""" + myPath + @""", Environment.CommandLine); 
     } 
    }"); 

    var compiler = new ProcessStartInfo 
    { 
    FileName = Path.Combine(Path.GetDirectoryName(systemPath), "csc.exe"), 
    Arguments = tempPath + ".cs", 
    WorkingDirectory = Path.GetDirectoryName(tempPath), 
    WindowStyle = ProcessWindowStyle.Hidden, 
    }; 

    var restarter = new ProcessStartInfo 
    { 
    FileName = tempPath + ".exe", 
    Arguments = commandLine, 
    WindowStyle = ProcessWindowStyle.Hidden, 
    }; 

    Process.Start(compiler).WaitForExit(); 
    Process.Start(restarter); // No WaitForExit: restarter WaitForExits us instead 

    File.Delete(tempPath); 
    File.Delete(tempPath + ".cs"); 
    Environment.Exit(0); 
} 

작동 원리 : 이것은 실제로 또 다른 "재시작 자"프로그램을 만들고 수행하지만 고통없이 자동으로 수행하면 다시 시작한 예를 들어 명령 행에서 통과, 다음의 메소드를 호출하기 만하면됩니다. restarter 프로그램에는 현재 프로세스 ID와 실행 파일 이름이 들어 있습니다. NET Framework 버전은 System.dll과 동일한 폴더에 호환되는 csc.exe와 함께 제공되므로 항상 컴파일러를 찾습니다.