sourcecode

WPF 애플리케이션을 재기동하려면 어떻게 해야 하나요?

copyscript 2023. 4. 9. 22:17
반응형

WPF 애플리케이션을 재기동하려면 어떻게 해야 하나요?

WPF 애플리케이션을 재기동하려면 어떻게 해야 합니까?Windows에서 사용한 양식

System.Windows.Forms.Application.Restart();

WPF에서는 어떻게 합니까?

이걸 찾았어요그건 효과가 있다.근데 더 좋은 방법이 있을까요?

System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
Application.Current.Shutdown();

WPF에서 이것을 사용하고 있습니다.

System.Windows.Forms.Application.Restart();
System.Windows.Application.Current.Shutdown();

1초 지연 후 명령줄별로 프로그램의 새 인스턴스를 실행합니다.지연 중에 현재 인스턴스가 셧다운됩니다.

ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C choice /C Y /N /D Y /T 1 & START \"\" \"" + Assembly.GetEntryAssembly().Location + "\"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
Process.GetCurrentProcess().Kill();

편집:

코드를 수정했습니다.

다음 대신:Assembly.GetExecutingAssembly().Location

이것은, 다음과 같습니다.Assembly.GetEntryAssembly().Location

이것은 함수가 다른 dll에서 실행될 때 중요합니다.

그리고...

다음 대신:Application.Current.Shutdown();

이것은, 다음과 같습니다.Process.GetCurrentProcess().Kill();

WinForms 와 WPF 에서는 모두 동작합니다.또, 양쪽 모두를 위해서 설계된 dll 을 쓰는 경우는, 매우 중요합니다.

Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();

이 순서는 나에게 효과가 있었지만, 그 반대로 앱의 다른 인스턴스가 시작되었습니다.

Application.Restart();

또는

System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();

내 프로그램에는 컴퓨터에서 실행되는 응용 프로그램의 인스턴스가 하나만 있는지 확인하는 뮤텍스가 있습니다.이로 인해 뮤텍스가 시기적절하게 출시되지 않았기 때문에 새로 시작된 응용 프로그램이 시작되지 않았습니다.그 결과 Properties에 값을 입력합니다.애플리케이션이 재기동하고 있는 것을 나타내는 설정.어플리케이션을 호출하기 전에속성을 재시작()합니다.설정값은 true로 설정됩니다.[프로그램 중]Main() 특정 속성에 대한 체크도 추가했습니다.true일 경우 false로 재설정되고 스레드가 존재하도록 설정합니다.sleep(3000);

프로그램에는 다음과 같은 논리가 있을 수 있습니다.

if (ShouldRestartApp)
{
   Properties.Settings.Default.IsRestarting = true;
   Properties.Settings.Default.Save();
   Application.Restart();
}

[프로그램 중]메인()

[STAThread]
static void Main()
{
   Mutex runOnce = null;

   if (Properties.Settings.Default.IsRestarting)
   {
      Properties.Settings.Default.IsRestarting = false;
      Properties.Settings.Default.Save();
      Thread.Sleep(3000);
   }

   try
   {
      runOnce = new Mutex(true, "SOME_MUTEX_NAME");

      if (runOnce.WaitOne(TimeSpan.Zero))
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new Form1());
      }
   }
   finally
   {
      if (null != runOnce)
         runOnce.Close();
   }
}

바로 그겁니다.

이러한 제안 솔루션은 효과가 있을지도 모릅니다만, 다른 코멘트가 말한 것처럼, 퀵 해킹이라고 하는 느낌이 듭니다.조금 더 깔끔하게 느껴지는 다른 방법은 현재(닫는) 애플리케이션이 종료될 때까지 지연(5초 등)을 포함한 배치 파일을 실행하는 것입니다.

이로 인해 두 응용 프로그램인스턴스가 동시에 열리지 않게 됩니다.이 경우 2개의 어플리케이션인스턴스가 동시에 열려 있는 것은 무효입니다.mutex를 사용하여 열려 있는 어플리케이션은 1개뿐입니다.어플리케이션은 하드웨어 자원을 사용하고 있기 때문입니다.

Windows 배치 파일('restart.bat')의 예:

sleep 5
start "" "C:\Dev\MyApplication.exe"

WPF 어플리케이션에서 다음 코드를 추가합니다.

// Launch the restart batch file
Process.Start(@"C:\Dev\restart.bat");

// Close the current application
Application.Current.MainWindow.Close();
 Application.Restart();
 Process.GetCurrentProcess().Kill();

내게는 부적처럼 작용한다.

Hoch의 예를 들어, 나는 다음을 사용했다.

using System.Runtime.CompilerServices;

private void RestartMyApp([CallerMemberName] string callerName = "")
{
    Application.Current.Exit += (s, e) =>
    {
        const string allowedCallingMethod = "ButtonBase_OnClick"; // todo: Set your calling method here

        if (callerName == allowedCallingMethod)
        {
            Process.Start(Application.ResourceAssembly.Location);
        }
     };

     Application.Current.Shutdown(); // Environment.Exit(0); would also suffice 
}

언급URL : https://stackoverflow.com/questions/4773632/how-do-i-restart-a-wpf-application

반응형