Как запустить процесс в C #, но он запускается только после выгрузки всех сборок? - PullRequest
2 голосов
/ 30 сентября 2010

У меня есть программа, которая порождает другой процесс из одной из загруженных сборок.Этот второй процесс запускается и захватывает установщик для программы, которая его породила (пока не запутался?).Этот второй процесс просто запускает установщик по определенному веб-адресу:

System.Diagnostics.Process.Start(www.mySite.com/myInstaller.exe);

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

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

Мой вопрос: как мне запустить этот процесс, чтобы он запускался только послесборки разгрузились?Есть ли лучший способ сделать все это?

Ответы [ 4 ]

3 голосов
/ 30 сентября 2010

Проверьте в дочернем процессе, вышел ли родительский процесс.

Если вы знаете имя вашего приложения, это будет простая проверка:

Process[] processes = Process.GetProcessesByName("calc");
Array.ForEach(processes, p => p.WaitForExit());
2 голосов
/ 30 сентября 2010

Итак, в основном у вас есть приложение, которое «самообновляется».Ваше основное приложение вызывает программу обновления, которая находит и находит установщик и запускает его.Затем запускается установщик, который может легко заменить сборку, которая называется программой обновления, и программу обновления.После завершения установки вы перезапустите приложение.

Вы можете (и .NET делает по умолчанию) использовать оболочку ОС для запуска нового процесса.Этот процесс не будет связан с его родителем;если, например, вы создали исполняемый файл, единственной целью которого было открыть Блокнот, ваш исполняемый файл будет вызывать Process.Start («notepad.exe»), Блокнот откроется, и ваш процесс закроется, оставив Блокнот открытым.1004 * Чтобы убедиться, что ваше приложение закрыто, вы можете использовать Process.GetProcesses () в установщике, который получит список процессов, которые вы увидите с помощью диспетчера задач.Сканируйте список на предмет имени исполняемого файла вашего приложения (и, если применимо, средства обновления);если он существует, попробуйте поспать секунду, затем попробуйте снова.Все еще там?Предупредите пользователя о необходимости вручную закрыть приложение, а затем, когда он скажет, что оно есть, проверьте еще раз.

0 голосов
/ 12 августа 2014

Mutex - класс, предназначенный для межпроцессной синхронизации.По сути, он создает именованную блокировку для всех запущенных процессов.Проверка запущенных процессов по имени кажется немного грязной (что, если кто-то переименует ваше приложение).

Пример использования:

static void Main(string[] args) {
  bool wasNewMutexCreated;
  using (var mutext = new Mutex(false, "MyMutext", out wasNewMutexCreated)) {
    if (!wasNewMutexCreated) {
      Console.Out.WriteLine("Can't continue - MyMutex is in use.");
    }
    // rest of your application logic
    Console.In.ReadLine();
  }
}

Пока ваше приложение и установщик используют это, все будет в порядке.(Если вы хотите разрешить несколько экземпляров своего приложения, не делайте «Не удается продолжить - MyMutex используется в вашем приложении, просто в вашем установщике).

0 голосов
/ 30 сентября 2010

Если ваш установщик "тупой", создайте другое приложение только для запуска установщика, как только основная программа будет завершена.

Несмотря на это, у меня есть автообновление во многих моих программах, и у меня никогда не было этой проблемы.

...