Как перезапустить приложение WPF? В Windows Forms я использовал
System.Windows.Forms.Application.Restart();
Как это сделать в WPF?
Как перезапустить приложение WPF? В Windows Forms я использовал
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();
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();
}
}
Что это.
Запускает новый экземпляр программы из командной строки с задержкой в 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.
Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();
В этом порядке работал у меня, наоборот, только что начал другой экземпляр приложения.
Эти предлагаемые решения могут работать, но, как уже отмечал еще один комментатор, они чувствуют себя как быстрый хак. Другой способ сделать это, который немного чище, - запустить пакетный файл, который включает задержку (например, 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();
Application.Restart();
Process.GetCurrentProcess().Kill();
работайте как очарование для меня
На примере Хуча я использовал следующее:
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
}