web-dev-qa-db-fra.com

Redémarrer une application par elle-même

Je veux construire mon application avec la fonction pour se redémarrer. J'ai trouvé sur 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();

Cela ne fonctionne pas du tout ... et l'autre problème est de savoir comment le redémarrer de cette manière?.

Modifier:

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

J'utilise un code similaire à celui que vous avez essayé lors du redémarrage des applications. J'envoie une commande timed cmd pour redémarrer l'application pour moi comme ceci:

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

La commande est envoyée au système d'exploitation. Le ping met le script en pause pendant 2 à 3 secondes. Le délai de sortie de l'application depuis Application.Exit() est écoulé.

Remarque: Le \" met des guillemets autour du chemin, à condition qu'il y ait des espaces que cmd ne peut pas traiter sans guillemets.

J'espère que cela t'aides!

39
Bali C

Pourquoi ne pas utiliser

Application.Restart();

??

Plus sur Redémarrer

27
Shai

Pourquoi pas juste ce qui suit?

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

Si vous voulez être sûr que l'application ne s'exécute pas deux fois, utilisez soit Environment.Exit(-1) qui tue le processus instantanément (ce n'est pas vraiment la méthode de Nice) ou quelque chose comme démarrer une deuxième application, qui vérifie le processus de l'application principale et le redémarre dès comme le processus est parti.

9
ChrFin

Vous avez l'application initiale A, vous voulez redémarrer ..__ Donc, lorsque vous voulez tuer A, une petite application B est lancée, B tuer A, puis B démarrer A et tuer B.

Pour démarrer un processus:

Process.Start("A.exe");

Tuer un processus, c'est quelque chose comme ça

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

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

Beaucoup de gens suggèrent d'utiliser Application.Restart. En réalité, cette fonction remplit rarement les attentes. Je ne l’ai jamais fait arrêter l’application dont je l’appelle. J'ai toujours dû fermer l'application à l'aide d'autres méthodes telles que la fermeture du formulaire principal.

Vous avez deux façons de gérer cela. Vous avez soit un programme externe qui ferme le processus appelant et en commence un nouveau,

ou,

vous avez le début de votre nouveau logiciel tuer d'autres instances de la même application si un argument est passé en tant que redémarrage.

        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 a la méthode Application.Restart() , qui fait exactement cela. Si vous utilisez WPF, vous pouvez simplement ajouter une référence à System.Windows.Forms et l'appeler.

3

Ma solution:

        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
Martin.Martinsson

Une autre façon de procéder qui semble un peu plus propre que ces solutions consiste à exécuter un fichier de traitement par lots qui inclut un délai spécifique pour attendre la fin de l'application en cours. Cela présente l’avantage supplémentaire d’empêcher l’ouverture simultanée des deux instances d’application.

Exemple de fichier de commandes Windows ("restart.bat"):

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

Dans l'application, ajoutez ce code:

// 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

Pour la solution d'application .Net ressemble à ceci:

System.Web.HttpRuntime.UnloadAppDomain()

Je l'ai utilisé pour redémarrer mon application Web après avoir modifié AppSettings dans le fichier myconfig.

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