Question

Je suis en train de redémarrer une application WPF.

J'ai essayé le suivant:

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

Et cela ne fonctionne pas parce que l'application est configuré comme une seule application les instances.

Je fatiguais ceci:

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

Et il ne fonctionne pas, car une fois que nous tuons le processus, il ne sera pas la ligne atteint 2

Est-il possible de programmer une .Start la sorte que je ne cours pas en question n ° 1.

Était-ce utile?

La solution

Vous pourriez lancer une application secondaire qui serait alors relancer votre programme principal après le délai. Quand j'ai écrit une auto-updater il y a quelques années, qui était le chemin de mise en œuvre que j'ai pris. Il était juste un programme simple qui a l'exécutable en ligne de commande arg, dormirais pour un dixième de seconde, puis il .START.

Une meilleure voie de mise en œuvre que je pris serait d'avoir le programme nouvellement lancé attente pour le processus qui l'a lancé mettre fin. En attendant la longueur de temps arbitraire pourrait compliquer les choses. Pour ce faire, je passerais probablement que l'ID de processus pour le nouveau lanceur afin qu'il sache exactement quel processus d'attendre le.

Autres conseils

Il est pas aussi difficile que vous le pensez. Tout ce que vous devez faire est d'appeler la méthode suivante, en passant dans la ligne de commande pour l'instance redémarrés:

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

Comment ça marche: Cela ne fait créer un autre programme « restarter », mais le fait sans douleur et automatiquement. Le programme restarter a le numéro de processus en cours et le nom du fichier exécutable intégré à elle. Il trouvera toujours le compilateur car la version NET Framework est livré avec un csc.exe compatible dans le même dossier que System.dll.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top