如何重新启动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(); 
 Application.Restart(); 

要么

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

在我的程序中,我有一个互斥锁来确保只有一个应用程序在计算机上运行。 这导致新启动的应用程序无法启动,因为互斥体没有及时释放。 因此,我将一个值放入Properties.Settings,指示应用程序正在重新启动。 在调用Application.Restart()之前,将Properties.Settings值设置为true。 在Program.Main()我也添加了一个特定的property.settings值的检查,以便当它真正重置为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(); } } 

而已。

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

在这个顺序为我工作,反过来刚刚开始另一个应用程序的实例。

这些build议的解决scheme可能会起作用,但正如另一位评论者所提到的那样,他们觉得有点像一个黑客。 另一种做这种感觉稍微清洁的方法是运行一个包含延迟(例如5秒)的batch file,以等待当前(closures)应用程序终止。

这可以防止两个应用程序实例同时打开。 在我的情况下,它是无效的两个应用程序实例同时打开 – 我正在使用一个互斥体,以确保只有一个应用程序打开 – 由于应用程序使用一些硬件资源。

Windowsbatch file示例(“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(); 

延迟1秒后,通过命令行运行程序的新实例。 在延迟电stream实例关机期间。

 ProcessStartInfo Info = new ProcessStartInfo(); Info.Arguments = "/C choice /CY /N /DY /T 1 & START \"\" \"" + Assembly.GetExecutingAssembly().Location + "\""; Info.WindowStyle = ProcessWindowStyle.Hidden; Info.CreateNoWindow = true; Info.FileName = "cmd.exe"; Process.Start(Info); Application.Current.Shutdown(); 
  Application.Restart(); Process.GetCurrentProcess().Kill(); 

像我的魅力一样工作