2011-01-23 65 views
59

如何重新启动WPF应用程序? 在Windows窗体我用如何重新启动WPF应用程序?

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

如何做到在WPF?

+3

可能的重复:http://stackoverflow.com/questions/3895188/restart-my-application-using-c,http://stackoverflow.com/questions/1225406/if-wpf-app-is - 不响应,然后自动重新启动,http://stackoverflow.com/questions/3634439/how-can-i-restart-wpf-application。共识是没有确切的WinForms方式的重复,所有的“解决方案”闻起来都有些尴尬。我怀疑这是因为除非在调试过程中,您通常不需要这样做。 – 2011-01-23 14:18:23

+0

@Cody Gray 现在我再次调用正在应用程序明星上调用的那些方法。它运作良好。但对于其他应用程序,我必须重新启动应用 – Hooch 2011-01-24 09:24:13

+2

@Cody Gray为什么你说永远不需要这个?为什么应用程序可能需要重新启动有很多原因,为什么强制用户重新运行可执行文件时,你可以为他们做到这一点? – epalm 2011-03-10 21:13:24

回答

73

我发现这个: 它的工作原理。 但是。 有没有更好的办法?

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

这是否保留了命令行参数!? – 2012-07-31 15:06:39

+1

@AndreiRinea不过,只是在开始时保存它们并将它们作为参数传递给此函数调用。这很容易。 – Hooch 2012-08-09 18:30:27

32

我在WPF用这个,成功:

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

这些提议的解决方案可以工作,但作为其他评论者所说,他们觉得有点像一个快速的黑客。另一种做法比较简单的方法是运行一个包含延迟(例如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(); 
9
Application.Restart(); 

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

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

就是这样。就像一个魅力

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

工作对我来说

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

在这种为了工作对我来说,周围的其他方法刚开始应用的另一个实例。

3

延迟1秒后通过命令行运行程序的新实例。 延迟当前实例关闭期间。

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