自行重新启动应用程序

本文关键字:应用程序 重新启动 | 更新日期: 2023-09-27 18:27:14

我想用重新启动自己的函数来构建我的应用程序。我在代码项目上找到

ProcessStartInfo Info=new ProcessStartInfo();
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+
               Application.ExecutablePath;
Info.WindowStyle=ProcessWindowStyle.Hidden;
Info.CreateNoWindow=true;
Info.FileName="cmd.exe";
Process.Start(Info); 
Application.Exit();

这根本不起作用。。。另一个问题是,如何像这样重新开始?也许启动应用程序也有争论。

编辑:

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=31454&av=58703

自行重新启动应用程序

我使用的代码与您在重新启动应用程序时尝试的代码类似。我发送了一个定时cmd命令来为我重新启动应用程序,如下所示:

ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C ping 127.0.0.1 -n 2 && '"" + Application.ExecutablePath + "'"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
Application.Exit(); 

命令被发送到操作系统,ping会暂停脚本2-3秒,此时应用程序已从Application.Exit()退出,然后ping后的下一个命令会再次启动它。

注意:'"在路径周围加引号,以防它有空格,没有引号cmd无法处理这些空格。

希望这能有所帮助!

为什么不使用

Application.Restart();

关于重新启动的更多信息

为什么不只是以下内容?

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

如果你想确保应用程序不会运行两次,请使用Environment.Exit(-1),它会立即终止进程(这不是一个好方法),或者启动第二个应用程序,它会检查主应用程序的进程,并在进程结束后立即重新启动。

您有了初始应用程序A,需要重新启动。所以,当你想杀死A时,启动一个小应用程序B,B杀死A,然后B启动A,然后杀死B。

启动流程:

Process.Start("A.exe");

要杀死一个进程,是不是类似于

Process[] procs = Process.GetProcessesByName("B");
foreach (Process proc in procs)
   proc.Kill();

很多人建议使用Application.Restart。实际上,这个函数很少能像预期的那样执行。我从未让它关闭过我调用它的应用程序。我总是不得不通过其他方法关闭应用程序,例如关闭主窗体

你有两种处理方式。您要么有一个外部程序关闭调用过程,然后启动一个新程序

或者,

若一个参数被传递为重新启动,那个么您的新软件的启动将杀死同一应用程序的其他实例。

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            try
            {
                if (e.Args.Length > 0)
                {
                    foreach (string arg in e.Args)
                    {
                        if (arg == "-restart")
                        {
                            // WaitForConnection.exe
                            foreach (Process p in Process.GetProcesses())
                            {
                                // In case we get Access Denied
                                try
                                {
                                    if (p.MainModule.FileName.ToLower().EndsWith("yourapp.exe"))
                                    {
                                        p.Kill();
                                        p.WaitForExit();
                                        break;
                                    }
                                }
                                catch
                                { }
                            }
                        }
                    }
                }
            }
            catch
            {
            }
        }

Winforms有Application.Restart()方法,它就是这样做的。如果您正在使用WPF,您可以简单地添加对System.Windows.Forms的引用并调用它。

另一种比这些解决方案更干净的方法是运行一个批处理文件,其中包括等待当前应用程序终止的特定延迟。这还有一个额外的好处,可以防止两个应用程序实例同时打开。

示例窗口批处理文件("restart.bat"):

sleep 5
start "" "C:'Dev'MyApplication.exe"

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

// Launch the restart batch file
Process.Start(@"C:'Dev'restart.bat");
// Close the current application (for WPF case)
Application.Current.MainWindow.Close();
// Close the current application (for WinForms case)
Application.Exit();

我的解决方案:

        private static bool _exiting;
    private static readonly object SynchObj = new object();
        public static void ApplicationRestart(params string[] commandLine)
    {
        lock (SynchObj)
        {
            if (Assembly.GetEntryAssembly() == null)
            {
                throw new NotSupportedException("RestartNotSupported");
            }
            if (_exiting)
            {
                return;
            }
            _exiting = true;
            if (Environment.OSVersion.Version.Major < 6)
            {
                return;
            }
            bool cancelExit = true;
            try
            {
                List<Form> openForms = Application.OpenForms.OfType<Form>().ToList();
                for (int i = openForms.Count - 1; i >= 0; i--)
                {
                    Form f = openForms[i];
                    if (f.InvokeRequired)
                    {
                        f.Invoke(new MethodInvoker(() =>
                        {
                            f.FormClosing += (sender, args) => cancelExit = args.Cancel;
                            f.Close();
                        }));
                    }
                    else
                    {
                        f.FormClosing += (sender, args) => cancelExit = args.Cancel;
                        f.Close();
                    }
                    if (cancelExit) break;
                }
                if (cancelExit) return;
                Process.Start(new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath,
                    Arguments = commandLine.Length > 0 ? string.Join(" ", commandLine) : string.Empty
                });
                Application.Exit();
            }
            finally
            {
                _exiting = false;
            }
        }
    }

这对我有效:

Process.Start(Process.GetCurrentProcess().MainModule.FileName);
Application.Current.Shutdown();

其他一些答案有一些巧妙的东西,比如等待ping给最初的应用程序时间来结束,但如果你只需要一些简单的东西,这很好。

For.Net应用程序解决方案如下所示:

System.Web.HttpRuntime.UnloadAppDomain()

在更改myconfig文件中的AppSettings后,我用它重新启动了我的web应用程序。

System.Configuration.Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~");
configuration.AppSettings.Settings["SiteMode"].Value = model.SiteMode.ToString();
configuration.Save();