Как отправить пользовательскую команду в .NET-службу Windows из .NET-кода?
Как и в следующей ссылке, можно остановить, запустить и "остановить, а затем запустить" службу с использованием кода С#.
http://www.csharp-examples.net/restart-windows-service/
Я испекла службу .NET, которая реализует OnStart
и OnStop
. Тем не менее, мне нужно реализовать функциональность "умного перезапуска", которая более активна, чем просто остановка и запуск. Мне нужно сохранить простои всего на несколько секунд, если это произойдет (но Stop + Start может принимать минуты в этом случае, когда это делается чисто, и я должен сделать это чисто), и наличие некоторых частей системы доступно, в то время как другие перезагружаются/обновляются.
Короче говоря - прежде чем я вступлю в реализацию этой функциональности OnSmartRestart
, я хочу убедиться, что есть достаточно простой способ вызвать этот вызов из другого приложения С#.
Эта функция важна, но опасна. Я хочу сделать его достаточно скрытым, несколько безопасным, а также сохранить его простым и убедиться, что это оказывает незначительное влияние на производительность моего Windows-сервиса, в то время как он выполняет обычные обязанности и не перезагружается.
Если мне нужно опросить какой-нибудь файл или открыть порт и потратить слишком много CPU на это, это не будет хорошим решением. Я также хочу сохранить это КАКОЙ-ЛИБО КАК ВОЗМОЖНО (извините за повторение).
Ответы
Ответ 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.