Pregunta

Estoy tratando de reiniciar una aplicación en WPF.

He intentado lo siguiente:

Process.Start(Application.ExecutablePath);
Process.GetCurrentProcess().Kill();

Y no funciona porque la aplicación se configura como una sola aplicación casos.

Luego me cansé esto:

Process.GetCurrentProcess().Kill();
Process.Start(Application.ExecutablePath);

Y no funciona porque una vez que matar el proceso no llegará a la línea 2

¿Hay una manera de programar una .start el fin de que no se ejecutan en la edición # 1.

¿Fue útil?

Solución

Se podría lanzar una aplicación secundaria que luego se vuelva a poner en marcha su programa principal después de la demora. Cuando escribí un auto-actualizador hace unos años, que era el camino que tomé aplicación. Era sólo un sencillo programa que tomó el ejecutable como arg línea de comandos, se durmió durante una décima de segundo, luego .start él.

Un camino mejor aplicación de Tomé sería tener la espera programa lanzado recientemente para el proceso que se puso en marcha a finalizar. Esperando la longitud arbitraria de tiempo podría complicar las cosas. Con el fin de lograr esto, probablemente me pase el identificador de proceso de la re-lanzador de modo que sabría exactamente qué proceso debe esperar sucesivamente.

Otros consejos

No es tan difícil como parece. Todo lo que necesita hacer es llamar al siguiente método, que pasa en la línea de comandos para la instancia reiniciado:

public static void RestartMe(string commandLine)
{
  var myId = Process.GetCurrentProcess().Id;
  var myPath = Assembly.GetEntryAssembly().CodeBase.Replace("file:///", "");
  var systemPath = typeof(object).Assembly.CodeBase.Replace("file:///", "");

  var tempPath = Path.GetTempFileName();

  File.WriteAllText(tempPath + ".cs", @"
    using System;
    using System.Diagnostics;
    public class App
    {
      public static void Main(string[] args)
      {
        try { Process.GetProcessById(" + myId + @").WaitForExit(); } catch {}
        Process.Start(""" + myPath + @""", Environment.CommandLine);
      }
    }");

  var compiler = new ProcessStartInfo
  {
    FileName = Path.Combine(Path.GetDirectoryName(systemPath), "csc.exe"),
    Arguments = tempPath + ".cs",
    WorkingDirectory = Path.GetDirectoryName(tempPath),
    WindowStyle = ProcessWindowStyle.Hidden,
  };

  var restarter = new ProcessStartInfo
  {
    FileName = tempPath + ".exe",
    Arguments = commandLine,
    WindowStyle = ProcessWindowStyle.Hidden,
  };

  Process.Start(compiler).WaitForExit();
  Process.Start(restarter); // No WaitForExit: restarter WaitForExits us instead

  File.Delete(tempPath);
  File.Delete(tempPath + ".cs");
  Environment.Exit(0);
}

¿Cómo funciona: En realidad, esto hace crear otro programa "restarter", pero lo hace sin dolor y de forma automática. El programa restarter tiene el identificador de proceso actual y el nombre del archivo ejecutable generado la derecha en ella. Siempre va a encontrar el compilador porque la versión barcos NET Framework con un csc.exe compatibles en la misma carpeta que System.dll.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top