如何重新启动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();
ApplicationDeployment.IsNetworkDeployed
将为false。有关更多信息,请参见http://bit.ly/RKoVBz。如果您的应用程序未使用ClickOnce部署,则此方法非常有效。 - blachnietApplicationDeployment.IsNetworkDeployed
是否为真而表现出不同的行为。例如,如果您在组织内进行ClickOnce部署,则可以推断您应该可以访问组织网络资源(文件共享、电子邮件服务器等)。 - blachnietEnvironment.GetCommandLineArgs()
获取它们,然后将它们传递给Process.Start
方法。 - Ahmed Fwela我在 WPF 中使用过这个,成功了:
System.Windows.Forms.Application.Restart();
System.Windows.Application.Current.Shutdown();
System.Windows.Forms.FolderBrowserDialog()
这样的WinForms魔法。 - epalm在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中都起作用,如果您编写了一个既适用于WinForms又适用于WPF的dll,则这一点非常重要。
Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();
这个顺序适用于我,反过来做只会启动应用程序的另一个实例。
Application.Restart();
或者System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();
我的程序中有一个互斥对象,用来确保在计算机上只有一个应用程序实例在运行。由于互斥对象没有及时释放,导致新启动的应用程序不能启动。因此,在 Properties.Settings 中放置了一个值,表示应用程序正在重新启动。在调用 Application.Restart() 之前,将 Properties.Settings 值设置为 true。在 Program.Main() 中,我还添加了对该特定属性设置值的检查,以便在值为 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();
}
}
就是这样。
sleep 5
start "" "C:\Dev\MyApplication.exe"
// 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
}