如何重新启动WPF应用程序?

时间:2011-01-23 11:50:41

标签: c# .net wpf .net-4.0

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

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

如何在WPF中执行此操作?

8 个答案:

答案 0 :(得分:88)

我发现了这个: 有用。 但。 还有更好的办法吗?

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

答案 1 :(得分:35)

我在WPF中成功使用了这个:

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

答案 2 :(得分:9)

Application.Restart();

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

在我的程序中,我有一个互斥锁,以确保只在计算机上运行一个应用程序实例。这导致新启动的应用程序无法启动,因为互斥锁未及时释放。因此,我在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();
   }
}

就是这样。

答案 3 :(得分:9)

延迟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,那么它非常重要。

答案 4 :(得分:7)

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

按照这个顺序为我工作,反过来只是启动了另一个应用程序实例。

答案 5 :(得分: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();

答案 6 :(得分:1)

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

对我来说就像一个魅力

答案 7 :(得分:0)

以Hooch为例,我使用了以下内容:

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 
}