自行重启应用程序

时间:2012-03-07 15:07:50

标签: c# .net windows batch-file application-restart

我想使用函数构建我的应用程序以重新启动它自己。我在codeproject上找到了

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

10 个答案:

答案 0 :(得分:40)

我对重启应用时尝试的代码使用了类似的代码。我发送了一个定时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无法在没有引号的情况下处理。

希望这有帮助!

答案 1 :(得分:27)

为什么不使用

Application.Restart();

...

更多关于Restart

答案 2 :(得分:9)

为什么不只是以下?

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

如果你想确保应用程序没有运行两次,请使用Environment.Exit(-1)即时终止进程(不是真正的好方法)或启动第二个应用程序,它会检查主进程应用程序,并在流程消失后再次启动它。

答案 3 :(得分:6)

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

开始一个过程:

Process.Start("A.exe");

要杀死进程,就像这样

Process[] procs = Process.GetProcessesByName("B");

foreach (Process proc in procs)
   proc.Kill();

答案 4 :(得分:3)

Winforms有Application.Restart()方法,就是这样做的。如果您使用的是WPF,则只需添加对System.Windows.Forms的引用并调用它即可。

答案 5 :(得分:3)

很多人都建议使用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
            {
            }
        }

答案 6 :(得分:1)

这样做的另一种方法感觉比这些解决方案更清洁,是运行批处理文件,其中包含等待当前应用程序终止的特定延迟。这具有防止两个应用程序实例同时打开的额外好处。

示例窗口批处理文件(“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();

答案 7 :(得分:1)

我的解决方案:

        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;
            }
        }
    }

答案 8 :(得分:0)

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

wofstring

我在myconfig文件中更改AppSettings后用它来重启我的Web应用程序。

System.Web.HttpRuntime.UnloadAppDomain()

答案 9 :(得分:0)

这对我有用:

1   2   3   4
8   7   6   5
9   10  11  12
 ↓ TYST AVD ↓
16  15  14  13
17  18  19  20
24  23  22  21

其他一些答案也很整洁,例如等待Process.Start(Process.GetCurrentProcess().MainModule.FileName); Application.Current.Shutdown(); 给初始应用程序一些时间,但是如果您只需要简单的东西,那就很好了。