Чтобы предотвратить возникновение этой ошибки и разрешить запуск службы за пределами обычного контроллера служб, вы можете установить флаг Environment.UserInteractive
.Если он установлен, вы можете запустить службу с выводом на консоль вместо того, чтобы запускать ее с кодом ServiceBase, который возвращает эту ошибку.
Добавьте это в начало Program.Main () перед кодом, которыйиспользует ServiceBase для запуска службы:
if (Environment.UserInteractive)
{
var service = new WindowsService();
service.TestInConsole(args);
return;
}
Поскольку методы OnStart и OnStop находятся в protected
в вашем сервисе, вам нужно добавить другой метод в этот класс, который вы можете запустить из Main (), и вызвать эти методыдля вас, например:
public void TestInConsole(string[] args)
{
Console.WriteLine($"Service starting...");
this.OnStart(args);
Console.WriteLine($"Service started. Press any key to stop.");
Console.ReadKey();
Console.WriteLine($"Service stopping...");
this.OnStop();
Console.WriteLine($"Service stopped. Closing in 5 seconds.");
System.Threading.Thread.Sleep(5000);
}
Наконец, убедитесь, что вывод является консольным приложением в свойствах проекта.
Теперь вы можете запустить исполняемый файл службы, как и любой другой, и он запустится как консоль.Если вы запустите его из Visual Studio, отладчик подключится автоматически.Если вы зарегистрируете его и запустите как сервис, он будет работать как сервис без каких-либо изменений.
Единственное различие, которое я обнаружил, заключается в том, что при запуске в качестве консольного приложения код не записывается в событиеlog, вы можете захотеть вывести на консоль все, что вы обычно регистрируете, также.
Эта методика отладки службы - одна из тех, которые описаны на docs.microsoft.com