Как создать Процесс, который переживает своего родителя - PullRequest
10 голосов
/ 17 июня 2009

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

Я обрабатываю всю логику сбора обновлений в утилите конфигурирования, затем пытаюсь запустить программу обновления для обработки фактических операций копирования / перезаписи файла. Очевидно, что из-за проблем с используемым файлом мне нужна утилита конфигурирования, чтобы выйти сразу после запуска программы обновления.

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

Можно ли каким-либо образом создать Процесс, который переживет своего родителя, или запустить внешнее приложение, которое может работать за пределами программы, которая его запустила?

EDIT:

По-видимому, в моем приложении для обновления я просчитал количество аргументов командной строки, которые ему передаются. Из-за этого программа обновления немедленно завершит работу. Я неверно истолковал это, чтобы означать, что приложение запуска убивало «дочерний» процесс, хотя на самом деле это не так.

Ответы ниже верны.

Ответы [ 3 ]

12 голосов
/ 17 июня 2009

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

Посмотрите этот простой пример программы, калькулятор останется открытым:

using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Process.Start(@"C:\windows\system32\calc.exe");
    }
}
5 голосов
/ 17 июня 2009

Нет причины, по которой процесс, запущенный с Process.Start, должен автоматически умирать при выходе из программы запуска. Я думаю, что вы делаете что-то странное в апдейтере.

Я уже писал апдейтер, который делал именно такие вещи раньше, и это было нормально.

Например:

Launcher.cs:

using System;
using System.Diagnostics;

class Launcher
{
    static void Main()
    {
        Console.WriteLine("Launching launchee");
        Process.Start("Launchee.exe");
        Console.WriteLine("Launched. Exiting");
    }
}

Launchee.cs:

using System;
using System.Threading;

class Launchee
{
    static void Main()
    {
        Console.WriteLine("       I've been launched!");
        Thread.Sleep(5000);
        Console.WriteLine("       Exiting...");
    }
}

Скомпилируйте их по отдельности и запустите Launcher.exe. Процесс «запуска» определенно длится дольше, чем запуск.

0 голосов
/ 17 июня 2009

Просто мысль из моей туманной памяти, но я, кажется, помню, что некоторое время назад обсуждал, что когда метод Process.Start вызывается из формы, порожденный процесс имеет какую-то зависимость (не уверен, что, почему или как , память немного туманна).

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

Просто мысль, как я уже сказал, это чисто из памяти, но некоторые из приведенных здесь примеров, все они вызваны из метода Main () консольного приложения, похоже, что-то пошатнули.

Надеюсь, у вас все получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...