Как отправить пользовательскую команду в службу Windows .NET из кода .NET? - PullRequest
33 голосов
/ 12 сентября 2010

Как и в следующей ссылке, можно остановить, запустить и «остановить, а затем запустить» службу, используя код C #.

http://www.csharp -examples.net / рестарт-окна-сервис /

Я запек сервис .NET, который реализует OnStart и OnStop. Однако мне нужно реализовать функцию «умного перезапуска», которая более сложна, чем просто остановка и запуск. Мне нужно сократить время простоя до нескольких секунд, если это так (но Stop + Start может занять минуты в этом случае, когда все сделано чисто, и я должен сделать это чисто), и чтобы некоторые части системы были доступны, в то время как другие перезагружаются / обновляются .

Короче говоря, прежде чем я приступлю к реализации этой функции OnSmartRestart, я хочу убедиться, что существует довольно простой способ вызвать этот вызов из другого приложения C #.

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

Если мне придется опросить какой-то файл или открыть порт и потратить на это слишком много ЦП, это не будет хорошим решением. Я также хочу сохранить это как ПРОСТО, КАК ВОЗМОЖНО (извините за повторение).

Ответы [ 2 ]

56 голосов
/ 12 сентября 2010

Вы можете отправлять «команды» службе, используя ServiceController.ExecuteCommand :

const int SmartRestart = 222;

var service = new System.ServiceProcess.ServiceController("MyService");
service.ExecuteCommand(SmartRestart);
service.WaitForStatus(ServiceControllerStatus.Running, timeout);

Вам необходимо добавить ссылку на сборку System.ServiceProcess.dll.

Служба может реагировать на команду путем переопределения ServiceBase.OnCustomCommand :

protected override void OnCustomCommand(int command)
{
    if (command == SmartRestart)
    {
        // ...
    }
}
14 голосов
/ 12 сентября 2010

Обычные средства связи с внешними процессами в Windows:

  1. Именованные трубы
  2. Головки
  3. COM-объект GetObject для получения ссылки на объект и последующего вызова его методов через открытый интерфейс.

Первые два были выставлены как WCF, так что это путь. Третий не имеет отношения к вашей ситуации и устарел.

Если вам нужно запускать команды с одной и той же машины, вы можете использовать именованные каналы, но усиление делает это очень трудным и хлопотным. В противном случае используйте именованную привязку WCF TCP.

...