46 votos

¿Cómo puedo reiniciar mi C# Aplicación WinForm?

El desarrollo de un C# .NET 2.0 Aplicación WinForm. Necesidad de que la aplicación se cierre y reinicie.

Application.Restart();

El método ha demostrado ser poco fiables.

¿Qué es una mejor manera de reiniciar la aplicación?

34voto

Darqer Puntos 776

Si usted está en la aplicación principal forma de intentar utilizar

System.Diagnostics.Process.Start( Application.ExecutablePath); // to start new instance of application
this.Close(); //to turn off current app

28voto

HiredMind Puntos 824

Desafortunadamente, usted no puede usar el Proceso.Start() para iniciar una instancia del proceso que se ejecuta actualmente. De acuerdo con el Proceso.Start() docs: "Si el proceso ya está en marcha, ningún proceso adicional de recursos que se inicia..."

Esta técnica funciona muy bien en el VS depurador (porque VS hace algún tipo de magia que hace que el Proceso.Empezar a pensar que el proceso no se está ejecutando), pero no cuando no se ejecute en el depurador. (Tenga en cuenta que esto puede ser específico de un SO - me parece recordar que en algunos de mis pruebas, se trabajó en ya sea XP o Vista, pero creo que podría estar recordando bajo el depurador.)

Esta técnica es exactamente el mismo utilizado por el último programador en el proyecto en el que estoy trabajando actualmente, y he estado tratando de encontrar una solución para esto por bastante tiempo. Hasta ahora, sólo he encontrado una solución, y sólo se siente sucio y desacoplados para mí: el inicio de una 2ª aplicación, que espera en el fondo de la primera aplicación, para terminar, a continuación, re-lanza la 1ª aplicación. Estoy seguro de que funcionaría, pero, puaj.

Edit: el Uso de una 2ª aplicación funciona. Todo lo que hice en la segunda aplicación fue:

    static void RestartApp(int pid, string applicationName )
    {
        // Wait for the process to terminate
        Process process = null;
        try
        {
            process = Process.GetProcessById(pid);
            process.WaitForExit(1000);
        }
        catch (ArgumentException ex)
        {
            // ArgumentException to indicate that the 
            // process doesn't exist?   LAME!!
        }
        Process.Start(applicationName, "");
    }

(Este es un ejemplo muy simplificado. El código real tiene un montón de cordura de cheques, manejo de errores, etc)

11voto

Robin Van Persi Puntos 5197

Yo podría ser tarde a la fiesta, pero aquí está mi solución simple y funciona como un encanto con todas las aplicaciones que tengo:

        try
        {
            //run the program again and close this one
            Process.Start(Application.StartupPath + "\\blabla.exe"); 
            //or you can use Application.ExecutablePath

            //close this one
            Process.GetCurrentProcess().Kill();
        }
        catch
        { }

8voto

JohnIdol Puntos 16355

Tuve exactamente el mismo problema y yo también había un requisito para evitar la duplicación de instancias - propongo una solución alternativa a la HiredMind propone (que funciona bien).

Lo que yo estoy haciendo es iniciar el nuevo proceso con el proceso de el proceso anterior (el que provoca el reinicio) como un cmd argumento de la línea:

// Shut down the current app instance.
Application.Exit();

// Restart the app passing "/restart [processId]" as cmd line args
Process.Start(Application.ExecutablePath, "/restart" + Process.GetCurrentProcess().Id);

Luego, cuando la nueva aplicación se inicia por primera vez me parse que el cm de la línea de argumentos y comprobar si el reinicio de la bandera está allí con un processId, a continuación, espere a que el proceso de Salida:

if (_isRestart)
{
   try
   {
      // get old process and wait UP TO 5 secs then give up!
      Process oldProcess = Process.GetProcessById(_restartProcessId);
      oldProcess.WaitForExit(5000);
   }
   catch (Exception ex)
   { 
      // the process did not exist - probably already closed!
      //TODO: --> LOG
   }
}

Estoy obviamente no se muestran todos los controles de seguridad que tengo en su lugar, etc.

Incluso si no es ideal - creo que esta es una alternativa válida para que usted no tiene que tener en su lugar una aplicación separada sólo para controlar reiniciar.

6voto

EMP Puntos 17246

Un enfoque mucho más simple que trabajó para mí es:

Application.Restart();
Environment.Exit();

Esto conserva los argumentos de línea de comandos y funciona a pesar de los controladores de eventos que normalmente evitar que la aplicación se cierre.

Al Reiniciar() intenta salir, se inicia una nueva instancia de todos modos y devuelve. La llamada Exit (), a continuación, finaliza el proceso, sin dar ningún controladores de eventos la oportunidad de correr. Hay un muy breve período de tiempo en que ambos procesos se están ejecutando, que no es un problema, en mi caso, pero puede ser en otros casos.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X