Запуск службы Windows в качестве консольного приложения
Я хочу отладить службу Windows, но появляется сообщение об ошибке
Не удается запустить службу из командной строки или отладчика. служба Windows должен быть установлен с помощью программы installutil.exe, а затем началось с обозреватель серверов, службы windows Средства администрирования или NET start команда.
Я действительно понятия не имею об этой ошибке.....
4 ответов
прежде чем служба Windows может работать, она должна быть" установлена " сначала с помощью installutil. Например:
C:\installutil -i c:\path\to\project\debug\service.exe
затем вы можете открыть список служб, чтобы запустить его. Например:
- Правой Кнопкой Мыши "Мой компьютер"
- нажмите "Управление"
- откройте "службы и приложения"
- нажмите на "услуги"
- найти сервис в списке и щелкните его правой кнопкой мыши
- нажмите 'Start'
после запущенный, вы можете войти в Visual Studio, нажмите "отладка", затем нажмите "прикрепить к процессу".
другой метод-добавить эту строку в метод OnStart () в сервисе:
System.Diagnostics.Debugger.Launch();
когда вы это сделаете,он предложит вам выбрать экземпляр Visual Studio для отладки службы.
вы можете изменить режим запуска сборки в зависимости от того, находитесь ли вы в режиме отладки (обычно внутри Visual Studio, но не обязательно) или в режиме выпуска (когда он работает как Служба в производстве):
изменить это:
static class Program
{
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()
};
ServiceBase.Run(ServicesToRun);
}
}
для этого:
static class Program
{
static void Main()
{
#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()
};
ServiceBase.Run(ServicesToRun);
#else
MyService myServ = new MyService();
myServ.Process();
// here Process is my Service function
// that will run when my service onstart is call
// you need to call your own method or function name here instead of Process();
#endif
}
}
техника взята из в этой статье и заслуга автора статьи, Tejas Vaishnav. Я скопировал фрагменты кода здесь, потому что так предпочитает полные ответы, а не ссылки, которые может, когда-нибудь исчезнет.
пожалуйста, проверьте, находитесь ли вы в режиме" DEBUG "или" RELEASE". Я получил эту ошибку, когда пытался отладить службу в режиме" RELEASE". Когда я изменил это на "DEBUG", все работало нормально.
Это после того, как вы правильно установили службу, как это было предложено другими людьми выше.
чтобы предотвратить эту ошибку и позволить службе работать вне обычного контроллера службы, вы можете проверить Environment.UserInteractive
флаг. Если он установлен, вы можете запустить службу с выводом на консоль, а не запускать ее в код ServiceBase, который возвращает эту ошибку.
добавьте это в начало программы.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, отладчик подключится автоматически. Если вы зарегистрируете его и запустите как службу, он будет работать правильно как Служба без каких-либо изменения.
единственное отличие, которое я нашел, заключается в том, что при запуске в качестве консольного приложения код не записывается в журнал событий, вы можете захотеть вывести все, что вы обычно регистрируете там на консоли.
этот метод отладки службы является одним из тех, которые объясняются на docs.microsoft.com