自行重启应用程序

Nol*_*oli 17 .net c# 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();
Run Code Online (Sandbox Code Playgroud)

这根本不起作用......另一个问题是,如何再次启动呢?也许还有启动应用程序的参数.

编辑:

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=31454&av=58703
Run Code Online (Sandbox Code Playgroud)

Bal*_*i C 40

我对重启应用时尝试的代码使用了类似的代码.我发送一个timed 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(); 
Run Code Online (Sandbox Code Playgroud)

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

注意:\"在路径周围放置引号,因为它有空格,cmd无法在没有引号的情况下处理.

希望这可以帮助!

  • 最好使用 Process.GetCurrentProcess().MainModule.FileName 代替 `Application.ExecutablePath` 在某些地方您无法调用 ExecutablePath (3认同)

Sha*_*hai 28

为什么不用

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

??

更多关于重启

  • 仅适用于表格 (8认同)

Chr*_*Fin 9

为什么不只是以下?

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

如果你想确保应用程序没有运行两次,那么使用Environment.Exit(-1)哪个瞬间杀死进程(不是真正的好方法)或启动第二个应用程序,它会检查主应用程序的进程并立即再次启动它这个过程消失了.


Men*_*zza 6

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

要开始一个过程:

Process.Start("A.exe");
Run Code Online (Sandbox Code Playgroud)

杀死一个进程就是这样的

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

foreach (Process proc in procs)
   proc.Kill();
Run Code Online (Sandbox Code Playgroud)


Jer*_*myK 5

很多人建议使用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
            {
            }
        }
Run Code Online (Sandbox Code Playgroud)