Как перезапустить приложение WPF?

Как перезапустить приложение WPF? В Windows Forms я использовал

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

Как это сделать в WPF?

Ответ 1

Я нашел это: Оно работает. Но. Есть ли лучший способ?

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

Ответ 2

Я использовал это в WPF, успешно:

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

Ответ 3

Application.Restart();

или

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

В моей программе у меня есть мьютекс, чтобы обеспечить только один экземпляр приложения, запущенного на компьютере. Это привело к тому, что вновь запущенное приложение не запускалось, потому что мьютекс не был выпущен своевременно. В результате я поместил значение в Properties.Settings, который указывает, что приложение перезагружается. Перед вызовом Application.Restart() значение Properties.Settings установлено равным true. В Program.Main() я также добавил проверку для этого конкретного значения property.settings, так что когда true это reset в false, и есть Thread.Sleep(3000);

В вашей программе у вас может быть логика:

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

В Program.Main()

[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();
   }
}

Что это.

Ответ 4

Запускает новый экземпляр программы из командной строки с задержкой в 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

this: Assembly.GetEntryAssembly().Location

Это важно, когда функция запускается в отдельной DLL.

А также -

вместо: Application.Current.Shutdown();

this: Process.GetCurrentProcess().Kill();

Это будет работать как в WinForms, так и в WPF.

Ответ 5

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

В этом порядке работал у меня, наоборот, только что начал другой экземпляр приложения.

Ответ 6

Эти предлагаемые решения могут работать, но, как уже отмечал еще один комментатор, они чувствуют себя как быстрый хак. Другой способ сделать это, который немного чище, - запустить пакетный файл, который включает задержку (например, 5 секунд), чтобы дождаться завершения текущего (закрывающего) приложения.

Это предотвращает одновременное открытие двух экземпляров приложения. В моем случае его недействительный для двух экземпляров приложения должен быть открыт одновременно - я использую мьютекс, чтобы убедиться, что открыто только одно приложение - из-за приложения, использующего некоторые аппаратные ресурсы.

Пример командного файла окон ( "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();

Ответ 7

 Application.Restart();
 Process.GetCurrentProcess().Kill();

работайте как очарование для меня

Ответ 8

На примере Хуча я использовал следующее:

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 
}