Frage

Ich versuche, eine Anwendung in WPF neu zu starten.

Ich habe versucht, die folgenden:

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

Und es funktioniert nicht, weil die Anwendung als einfache Instanz Anwendung.

Dann müde ich diese:

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

Und es funktioniert nicht, weil, wenn wir den Prozess töten sie nicht Linie getroffen werden 2

Gibt es eine Möglichkeit, eine der .Start so zu planen, dass ich laufen nicht in der Ausgabe # 1.

War es hilfreich?

Lösung

Sie können eine sekundäre Anwendung starten, die dann Ihr Hauptprogramm nach der Verzögerung wieder in Gang bringen würde. Als ich vor ein selbst Updater ein paar Jahren schrieb, dass die Umsetzung Weg war, dass ich nahm. Es war nur ein einfaches Programm, das die ausführbare Datei als Befehlszeilen arg nahm, für eine Zehntelsekunde schlafen würde, dann ist es .Über.

Ein bessere Implementierung Weg als wäre ich nahm die neu eingeführte Programm wartet auf den Prozess zu haben, die sie ins Leben gerufen zu beenden. Warten auf die willkürliche Länge der Zeit, die Sache noch komplizierter könnte. Um dies zu erreichen, würde ich wahrscheinlich die Prozess-ID des Wiederwerfer geben, so dass es genau wissen würde, welcher Prozess auf warten.

Andere Tipps

Es ist nicht so schwer wie Sie denken. Alles, was Sie tun müssen, ist die folgende Methode aufrufen, in der Befehlszeile für das neu gestartete Instanz übergeben:

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

Wie es funktioniert: Das macht eigentlich einen anderen „restarter“ Programm erstellen, aber tut es schmerzlos und automatisch. Das restarter Programm hat den aktuellen Prozess-ID und die ausführbaren Dateinamen direkt hinein gebaut. Es wird immer die Compiler finden, da NET Framework-Version wird mit einem kompatibelen csc.exe im selben Ordner wie System.dll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top