web-dev-qa-db-de.com

Starten Sie eine Anwendung neu

Ich möchte meine Anwendung mit der Funktion erstellen, um sich selbst neu zu starten. Ich habe auf codeproject gefunden

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();

Das funktioniert überhaupt nicht ....__ und das andere Problem ist, wie man es so wieder startet? Vielleicht gibt es auch Argumente, um Anwendungen zu starten.

Bearbeiten:

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

Ich verwende einen ähnlichen Code wie der Code, den Sie beim Neustart von Apps ausprobiert haben. Ich sende einen zeitgesteuerten Befehl, um die App für mich wie folgt neu zu starten:

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(); 

Der Befehl wird an das Betriebssystem gesendet, der Ping hält das Skript für 2-3 Sekunden an, bis zu dem die Anwendung von Application.Exit() beendet wurde. Anschließend startet der nächste Befehl nach dem Ping erneut.

Hinweis: Der \" setzt Anführungszeichen um den Pfad, wenn er Leerzeichen enthält, die cmd nicht ohne Anführungszeichen verarbeiten kann.

Hoffe das hilft!

39
Bali C

Warum nicht verwenden?

Application.Restart();

??

Mehr zu Neustart

27
Shai

Warum nicht nur das Folgende?

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

Wenn Sie sichergehen möchten, dass die App nicht zweimal ausgeführt wird, verwenden Sie entweder Environment.Exit(-1), wodurch der Prozess sofort abgebrochen wird (nicht wirklich der schöne Weg), oder so etwas wie das Starten einer zweiten App, die den Prozess der Haupt-App überprüft und sobald wie möglich neu startet wie der prozess weg ist.

9
ChrFin

Sie haben die anfängliche Anwendung A, die Sie neu starten möchten ..__ Wenn Sie also A beenden möchten, wird eine kleine Anwendung B gestartet.

So starten Sie einen Prozess:

Process.Start("A.exe");

Einen Prozess zu töten ist so etwas

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

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

Viele Leute schlagen vor, Application.Restart zu verwenden. In der Realität funktioniert diese Funktion selten wie erwartet. Ich habe nie die Anwendung heruntergefahren, von der ich es anrufe. Ich musste die Anwendung immer durch andere Methoden schließen, beispielsweise durch Schließen des Hauptformulars.

Sie haben zwei Möglichkeiten, damit umzugehen. Sie haben entweder ein externes Programm, das den aufrufenden Prozess beendet und ein neues startet.

oder,

sie haben den Start Ihrer neuen Software, um andere Instanzen derselben Anwendung zu beenden, wenn ein Argument als Neustart übergeben wird.

        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
            {
            }
        }
3
JeremyK

Winforms verfügt über die Methode Application.Restart() , die genau das tut. Wenn Sie WPF verwenden, können Sie einfach einen Verweis auf System.Windows.Forms hinzufügen und ihn aufrufen.

Meine Lösung:

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

Eine andere Methode, die sich ein wenig sauberer anfühlt als diese Lösungen, besteht im Ausführen einer Batchdatei, die eine bestimmte Verzögerung enthält, um zu warten, bis die aktuelle Anwendung beendet wird. Dies hat den zusätzlichen Vorteil, dass die beiden Anwendungsinstanzen nicht gleichzeitig geöffnet werden.

Beispiel-Windows-Batchdatei ("restart.bat"):

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

Fügen Sie in der Anwendung diesen Code hinzu:

// 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();
1
dodgy_coder

Für die .Net-Anwendungslösung sieht das so aus:

System.Web.HttpRuntime.UnloadAppDomain()

Ich habe dies verwendet, um meine Webanwendung nach dem Ändern von AppSettings in der Datei myconfig neu zu starten.

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