Подтвердить что ты не робот

Как отправить пользовательскую команду в .NET-службу Windows из .NET-кода?

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

http://www.csharp-examples.net/restart-windows-service/

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

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

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

Если мне нужно опросить какой-нибудь файл или открыть порт и потратить слишком много CPU на это, это не будет хорошим решением. Я также хочу сохранить это КАКОЙ-ЛИБО КАК ВОЗМОЖНО (извините за повторение).

4b9b3361

Ответ 1

Вы можете отправить "команды" в службу, используя 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)
    {
        // ...
    }
}

Ответ 2

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

  • Именованные каналы
  • Розетки
  • COM GetObject, чтобы получить ссылку на объект, а затем вызвать его методы поверх открытого интерфейса.

Первые два были показаны как WCF, так что это путь. Третье не похоже на вашу ситуацию и состарилось.

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