Запуск службы Windows в качестве консольного приложения

Я хочу отладить службу Windows, но появляется сообщение об ошибке

Не удается запустить службу из командной строки или отладчика. служба Windows должен быть установлен с помощью программы installutil.exe, а затем началось с обозреватель серверов, службы windows Средства администрирования или NET start команда.

Я действительно понятия не имею об этой ошибке.....

enter image description here

4 ответов


прежде чем служба Windows может работать, она должна быть" установлена " сначала с помощью installutil. Например:

C:\installutil -i c:\path\to\project\debug\service.exe

затем вы можете открыть список служб, чтобы запустить его. Например:

  1. Правой Кнопкой Мыши "Мой компьютер"
  2. нажмите "Управление"
  3. откройте "службы и приложения"
  4. нажмите на "услуги"
  5. найти сервис в списке и щелкните его правой кнопкой мыши
  6. нажмите '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