Могу ли я делегировать выполнение службы Windows другому процессу? - PullRequest
0 голосов
/ 03 января 2012

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

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

Возможно ли это сделать в .NET?

РЕДАКТИРОВАТЬ: Чтобы уточнитьВот как будет выглядеть рабочий процесс:

  1. Служба запускается, запускает a.exe.Примечание: a.exe не вызывает ServiceBase.Run ()
  2. a.exe запускает b.exe с помощью Process.Start ()
  3. a.exe и b.exe выполняет любую связь, необходимую для обмена информацией, такую ​​как дескрипторы процесса или службы (Примечание: эта функция уже существует)
  4. a.exe назначает управление службой для выходов b.exe
  5. a.exe,оставив b.exe работающим и привязанным к контролю сервиса

Ответы [ 3 ]

1 голос
/ 03 января 2012

Нет, вы не можете изменить процесс, связанный с диспетчером управления службами. Чтобы понять, почему это невозможно, вам нужно посмотреть, как работает неуправляемый API службы Windows. (который .NET упаковывает).

Вы подключаетесь к диспетчеру управления службами, вызывая StartServiceCtrlDispatcher (который может быть вызван только один раз). В параметре lpServiceTable вы передаете указатель на функцию ServiceMain, которая, очевидно, действительна только для текущего процесса, и все уведомления управления службами отправляются этой функции.

Звонок на StartServiceCtrlDispatcher также не возвращается, пока все службы не будут остановлены. Таким образом, управляемый элемент управления службой также связан с потоком в процессе, который запустил службу, поэтому он не может выйти без прерывания связи с менеджером службы.

Так что в вашем примере шаг 4 не может быть выполнен, и процесс a.exe должен оставаться в живых в течение продолжительности.

1 голос
/ 03 января 2012

Эта статья может быть полезна:

Запуск программ Windows из службы NT

0 голосов
/ 03 января 2012

См. Process.Start () , этот учебник (старый, но должен работать), или этот .

Если вы пытаетесь запустить уже зарегистрированную службу, это может помочь .

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

Вы можете использовать WCF, открыть сокет, использовать базу данных и т. Д. Без дополнительной информации о том, какой тип связи вам необходим, трудно рекомендовать конкретный подход.

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