Вопрос по windows, c# – Как создать Процесс, который переживает своего родителя

10

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

@quillbreaker: я обновил теги, чтобы прояснить это, хорошая мысль! Chris Carter
У меня была ошибка в моем коде обновления, которая вынудила его немедленно завершиться. Я предположил, что это было из "запуска" процесс его закрытия. Я соответственно обновил свое сообщение. Есть ли способ дать себе отрицательную репутацию в качестве самонаказания за такую нелепую ошибку? Chris Carter
Я знаю, что это своего рода задом наперед, но не могли бы вы иметь процесс, вся задача которого состоит в управлении запуском как утилиты конфигурирования, так и вашего приложения? Таким образом, вы можете обновить приложение и утилиту конфигурации (если это необходимо) по отдельности, и вам не придется беспокоиться о том, что дочерние процессы умирают вместе с их родителем (так как родитель всегда будет работать). Michael Todd
Можем ли мы предположить, что вы используете C # / .net / Win32, а не C # / Mono / * nix? Я не знаю, работает ли Process одинаково во всех средах. quillbreaker

Ваш Ответ

3   ответа
0

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

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Chris Carter
12

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

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

using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Process.Start(@"C:\windows\system32\calc.exe");
    }
}
Error: User Rate Limit Exceeded Chris Carter
5

Нет причин, по которым процесс начался с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. & Quot; лаунчи & quot; Процесс определенно длится дольше, чем у лаунчера.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededMinimal, Complete, and Verifiable exampleError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Chris Carter
Error: User Rate Limit Exceeded

Похожие вопросы