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

Hoo*_*och 76 .net c# wpf .net-4.0

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

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

如何在WPF中做到这一点?

Hoo*_*och 95

我发现了这个:它有效.但.有没有更好的方法?

System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
Application.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果使用ClickOnce部署应用程序,则不希望使用此方法.重新启动时,`ApplicationDeployment.IsNetworkDeployed`将为false.有关详细信息,请参阅http://bit.ly/RKoVBz.如果您的应用程序未使用ClickOnce部署,则此方法非常有效. (15认同)
  • 如果你想保留命令行参数,你可以先从`Environment.GetCommandLineArgs()`获取它们然后将它们传递给Process.Start方法 (3认同)

epa*_*alm 36

我在WPF中使用过这个,成功:

System.Windows.Forms.Application.Restart();
System.Windows.Application.Current.Shutdown();
Run Code Online (Sandbox Code Playgroud)

  • @commanderz我倾向于同意,但是我已经在同一个项目中使用WinForms魔术,如`System.Windows.Forms.FolderBrowserDialog()`. (10认同)
  • 我认为仅为此包含WinForms程序集引用有点过分. (7认同)
  • @MatějZábský使用ClickOnce时甚至是必要的. (2认同)
  • 这是我发现重新启动 ClickOnce 应用程序的唯一方法。谢谢。 (2认同)

Pas*_*lsz 11

Application.Restart();
Run Code Online (Sandbox Code Playgroud)

要么

System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();
Run Code Online (Sandbox Code Playgroud)

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

在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();
   }
}
Run Code Online (Sandbox Code Playgroud)

而已.

  • 这个答案(标记为答案)具有误导性.最初的问题是关于重新启动WPF应用程序,类似于在WinForms中完成的方式.不幸的是,你的答案仍然是使用WinForms重启(WPF中没有的东西),还包含与被问到的问题无关的例子(如Mutex?). (17认同)
  • 也许误导WPF-Only回答,但对我来说与其他答案结合使用很有用,因为我需要重新启动使用互斥锁的WPF.这样做了. (3认同)

mag*_*ode 10

在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();
Run Code Online (Sandbox Code Playgroud)


Jra*_*o11 8

Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();
Run Code Online (Sandbox Code Playgroud)

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

  • 我无法确切地告诉你为什么它可以工作,但只能说它在WPF中 (2认同)

dod*_*der 5

这些提议的解决方案可能有效,但正如另一位评论者所提到的,它们感觉有点像快速破解。另一种感觉更简洁的方法是运行一个批处理文件,其中包含延迟(例如 5 秒)以等待当前(关闭)应用程序终止。

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

示例 Windows 批处理文件(“restart.bat”):

sleep 5
start "" "C:\Dev\MyApplication.exe"
Run Code Online (Sandbox Code Playgroud)

在 WPF 应用程序中,添加以下代码:

// Launch the restart batch file
Process.Start(@"C:\Dev\restart.bat");

// Close the current application
Application.Current.MainWindow.Close();
Run Code Online (Sandbox Code Playgroud)

  • 写一个带睡眠的批处理文件感觉就像一个漫长的黑客,但可能更糟。 (12认同)