Как создать процесс, который переживает его родительский

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

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

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

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

EDIT:

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

Ниже приведены правильные ответы.

Ответ 1

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

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

using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Process.Start(@"C:\windows\system32\calc.exe");
    }
}

Ответ 2

Нет причин, по которым процесс, начинающийся с 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. Процесс "лихорадки" определенно длится дольше, чем пусковая установка.

Ответ 3

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

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

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

Надеюсь, что все будет хорошо для вас.