Как запланировать процесс. Начать в WPF - PullRequest
2 голосов
/ 16 июня 2010

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

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

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

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

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

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

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

Есть ли способ запланировать .Start, чтобы я не столкнулся с проблемой# 1.

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

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

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

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

2 голосов
/ 16 июня 2010

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

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

...