Запустите службу Windows как консольное приложение - PullRequest
28 голосов
/ 01 марта 2011

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

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

У меня нет ни малейшего представления об этой ошибке .....

enter image description here

Ответы [ 6 ]

36 голосов
/ 01 марта 2011

Перед запуском службы Windows ее необходимо сначала установить с помощью installutil.EG:

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

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

  1. Щелкните правой кнопкой мыши «Мой компьютер»
  2. Нажмите «Управление»
  3. Откройте «Службы и приложения»
  4. Нажмите «Службы '
  5. Найдите свою службу в списке и щелкните ее правой кнопкой мыши
  6. Нажмите «Пуск»

После ее запуска вы можете перейти в VisualStudio, нажмите «Отладка», затем нажмите «Присоединить к процессу».

Другой способ - добавить эту строку в метод OnStart () в службе:

System.Diagnostics.Debugger.Launch();

Когдапосле этого вам будет предложено выбрать экземпляр Visual Studio для отладки службы.

16 голосов
/ 02 апреля 2014

Вы можете изменить режим запуска сборки в зависимости от того, находитесь ли вы в режиме DEBUG (обычно в Visual Studio, но не обязательно) или в режиме RELEASE (когда он работает как служба в производстве):

Изменить:

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
    }
}

Техника взята из этой статьи , а автором статьи является Теджас ВайшнавЯ скопировал фрагменты кода здесь, потому что SO предпочитает полные ответы, а не ссылки, которые могут исчезнуть через некоторое время.

2 голосов
/ 03 марта 2018

Чтобы предотвратить возникновение этой ошибки и разрешить запуск службы за пределами обычного контроллера служб, вы можете установить флаг 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

1 голос
/ 30 марта 2016

Пожалуйста, проверьте, находитесь ли вы в режиме «DEBUG» или «RELEASE». Я получил эту ошибку, когда пытался отладить службу в режиме «RELEASE». Когда я изменил это на "DEBUG", все работало нормально.

Это после того, как вы правильно установили службу, как предложили другие люди выше.

0 голосов
/ 08 февраля 2019

Другая причина может заключаться в том, что конфигурация решения находится в режиме выпуска вместо режима отладки enter image description here

enter image description here

0 голосов
/ 09 ноября 2018

Для решения этой проблемы создан пакет nuget: install-package WindowsService.Gui

Image of the runner GUI

Что делает пакет?

Это помогает путем создания пользовательского интерфейса Play / Stop / Pause при работе с подключенным отладчиком, но также позволяет устанавливать и запускать службу Windows в среде служб Windows. Все это с одной строкой кода! Что такое Service Helper Будучи тем, кто много пишет для Windows Services, может быть неприятно иметь дело с головными болями, связанными с отладкой сервисов. Часто это включает в себя уловки, взломы и частичные обходные пути для проверки всего вашего кода. Для разработчиков Windows Services нет опыта «просто нажми F5».

Service Helper решает эту проблему, вызывая отображение пользовательского интерфейса, если подключен отладчик, имитирующий (как можно ближе) среду служб Windows.

Проект github находится здесь: https://github.com/wolfen351/windows-service-gui

Как пользоваться?

Самый простой способ получить Windows Service Helper в вашем проекте - это использовать пакет ServiceProcess.Helpers NuGet на официальном фиде NuGet.

Просто внесите несколько изменений в типичный код «Program.cs» для вашего приложения:

using System.ServiceProcess;
using ServiceProcess.Helpers; //HERE

namespace DemoService
{
    static class Program
    {
    static void Main()
    {
        ServiceBase[] ServicesToRun;

        ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };

        //ServiceBase.Run(ServicesToRun);
        ServicesToRun.LoadServices(); //AND HERE
    }
    }
}

Раскрытие информации: я поддерживаю этот проект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...