Вопрос

Я пытаюсь перезапустить приложение в WPF.

Я попробовал следующее:

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

И это не работает, потому что приложение установлено в качестве приложения одного экземпляра.

Тогда я устал это:

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

И это не работает, потому что, как только мы убьем процесс, он не будет достигнут линию 2

Есть ли способ запланировать .start, чтобы я не бел в проблему № 1.

Это было полезно?

Решение

Вы можете запустить вторичное приложение, которое затем повторно запустит вашу основную программу после задержки. Когда я написал самоуверению несколько лет назад, это был путь реализации, который я взял. Это была просто простая программа, которая взяла исполняемый файл в качестве командной строки ARG, будет спать на десятую секунду, затем.

Лучший путь внедрения, чем я взял, будет иметь вновь запущенную программу ждать процесса, который запустил его для завершения. Ожидание произвольного периода времени может усложнить вопросы. Чтобы выполнить это, я бы, вероятно, пройдет идентификатор процесса в реконструкцию, чтобы он точно знал, какой процесс ждать.

Другие советы

Это не так сильно, как вы думаете. Все, что вам нужно сделать, это вызвать следующий метод, проходя в командной строке для перезапущенного экземпляра:

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

Как это работает: это на самом деле создает еще одну программу «Restarter», но это безболезненно и автоматически. Программа Restarter имеет текущий идентификатор процесса и исполняемое имя файла, встроенное в него. Он всегда найдет компилятор, потому что Net Framework версия отправляется с совместимым CSC.exe в той же папке, что и System.dll.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top