В настоящее время я пишу небольшой код начальной загрузки для службы, которую можно запустить в консоли. По сути, это сводится к вызову метода OnStart() вместо того, чтобы использовать ServiceBase для запуска и остановки службы (потому что она не запускает приложение, если оно не установлено как служба и делает отладку кошмаром).
В настоящее время я использую Debugger.IsAttached, чтобы определить, следует ли мне использовать ServiceBase.Run или [service].OnStart, но я знаю, что это не лучшая идея, потому что некоторые конечные пользователи хотят запустить службу в консоли (чтобы увидеть выход и т.д. в реальном времени).
Любые идеи о том, как я могу определить, запущен ли сервисный контроллер Windows "я", или пользователь начал "меня" в консоли? Очевидно, Environment.IsUserInteractive - не ответ. Я думал об использовании командной строки args, но это кажется "грязным".
Я всегда мог видеть выражение о try-catch в ServiceBase.Run, но это кажется грязным. Изменить: попытка catch не работает.
У меня есть решение: поставить его здесь для всех других заинтересованных штабелеров:
public void Run()
{
if (Debugger.IsAttached || Environment.GetCommandLineArgs().Contains<string>("-console"))
{
RunAllServices();
}
else
{
try
{
string temp = Console.Title;
ServiceBase.Run((ServiceBase[])ComponentsToRun);
}
catch
{
RunAllServices();
}
}
} // void Run
private void RunAllServices()
{
foreach (ConsoleService component in ComponentsToRun)
{
component.Start();
}
WaitForCTRLC();
foreach (ConsoleService component in ComponentsToRun)
{
component.Stop();
}
}
EDIT: Был еще один вопрос в StackOverflow, где у парня были проблемы с Environment.CurrentDirectory, являющийся "C:\Windows\System32", выглядит так, что это может быть ответ. Я буду тестировать сегодня.