Самый простой способ разработки / отладки службы Windows - PullRequest
4 голосов
/ 15 июля 2009

Я занимаюсь разработкой службы Windows в VB.NET 2008, но чувствую, что у меня аневризма. Чтобы отладить службу, я добавил 15-секундное ожидание к коду инициализации, что дает мне время запустить службу и подключить отладчик .NET, прежде чем что-либо произойдет, так что я могу достичь точек останова и тому подобного. Я действительно скучаю по "интегрированной" отладке с этим типом обходного пути, и тестирование кажется огромной болью.

Как лучше всего проводить «обычную» отладку службы Windows, находящейся в разработке? Один из вариантов, который я рассмотрел, - это перенести всю мою логику в проект DLL, оставив только логику управления в самом сервисе, а затем создать проект Forms, который по сути просто имел кнопки «старт» и «стоп», и вызвал DLL делать все остальное. Таким образом, я могу нормально отлаживать свой код, а затем просто развернуть скомпилированный сервис, когда библиотеки DLL будут готовы.

Имеет ли это смысл / раздражать других? Я открыт для любых доступных обходных путей. Предложение ПБ здесь звучит так, как я спрашиваю - кто-нибудь использовал этот подход?

Ответы [ 9 ]

13 голосов
/ 15 июля 2009

Если вы можете немного справиться с C #, я так и сделаю.

Предполагая, что у вас есть класс MainService, производный от ServiceBase с методом onStart, затем, когда он не работает внутри отладчика, служба запускается нормально, в противном случае onStart вызывается вручную, что запускает код в режиме консоли.

static void Main(string[] args)
{
       // If no command line arguments, then run as a service unless we are debugging it.
       if ( args.Length == 0) 
       {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                 System.Diagnostics.Debugger.Break();
                 args = new string[] { "/NonService"} ;
            }
          else
                 args = new string[] { "/Service"} ;
       }

       string cmdLine = args[0].ToLower().Substring(1);
       Console.WriteLine("Starting Program with Cmdline : " + args[0]);
       switch (cmdLine)
       {
           case "service" :
               ServiceBase.Run(new MainService());
               break;

           case "nonservice" :
               MainService ms = new MainService();
               ms.OnStart(null);
               break;

         ...

         default :
            Console.Error.WriteLine("Unknown Command line Parameter");
            Console.Error.WriteLine("Supported options are /Install /Uninstall /Start /Stop /Status /Service and /NonService");
         }
11 голосов
/ 15 июля 2009

Помимо использования Debugger.Break (), о котором уже упоминали несколько других, я записываю весь свой сервисный код в отдельной сборке в сам проект проекта Windows. Затем я также пишу консольное приложение для Windows, которое вызывает тот же сервисный код. Это позволяет мне отлаживать в IDE, просто задав консольное приложение в качестве запускаемого проекта.

Проект службы Windows и консольное приложение Windows в буквальном смысле ничего не делают, кроме как называют «основной» код службы, поэтому область для дефектов из-за различий между службой и приложением консоли минимальна.

8 голосов
/ 15 июля 2009
Debugger.Break()  

:)

6 голосов
/ 15 июля 2009

Когда я разрабатываю службу Windows с использованием .NET, я использую преимущества модульных тестов плюс TypeMock , так что я могу запустить код службы в модульном тесте, не подключаясь к работающему экземпляру. службы. Другие насмешливые рамки, на которые вы можете посмотреть, включают Rhino Mocks .

Таким образом, я планировал использовать MSTest для создания проекта модульного теста и методов тестирования, которые выполняются для моего сервиса, и любые зависимости во время выполнения будут обрабатываться TypeMock, что создаст фиктивные объекты для использования моим сервисом. Поэтому, если мой сервис обрабатывал, например, что-то, связанное с файлами, я мог бы создать фиктивный файл, используя TypeMock, и использовать его в своем модульном тесте для передачи в сервис.

В прошлом мне приходилось испытывать трудности с компиляцией службы, ее установкой, запуском и подключением и т. Д. Когда я обнаружил фальшивые фреймворки, было очень приятно испытать мой код одним щелчком мыши. кнопка из среды разработки Visual Studio.

Дайте ему попытку.

3 голосов
/ 22 мая 2014

Другой способ - перейти в файл service1.designer.vb, найти и «инкапсулировать» следующий код метода следующим образом:

Shared Sub Main()
#If DEBUG Then
   Dim servicio As New Service1
   servicio.OnStart(Nothing)
   System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite)
#Else
   Dim ServicesToRun() As System.ServiceProcess.ServiceBase               'original code
   ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1} 'original code
   System.ServiceProcess.ServiceBase.Run(ServicesToRun)                   'original code
#End If

Надеюсь, это поможет тем программистам, у которых есть устаревший код;) Кредиты достаются коллеге-программисту, который научил меня.

2 голосов
/ 15 июля 2009

Я пишу свои службы Windows как консольное приложение, затем просто перемещаю код инициализации из Main в команду Service_Start. Это работает для большинства услуг. Вы все еще можете протестировать функциональность Stop / Start службы через консольное приложение.

2 голосов
/ 15 июля 2009

Я создал службу WCF, которая выполняется как приложение командной строки с расширением .EXE. Это позволяет мне легко загружать приложение в режиме отладки или вне VS, просто дважды щелкнув по нему. Затем у меня есть другой проект, который является хостом службы Windows и содержит ссылку на мой проект службы WCF. Служба хоста может обрабатывать файл .exe так же, как файл .dll.

Возможно, у меня есть проблемы, с которыми я не сталкивался, поэтому я не могу рекомендовать это как «лучшую практику», но он очень хорошо работает для меня и решает проблемы, с которыми вы имеете дело.

1 голос
/ 15 июля 2009

Как сказал Леппи и другие, включая предложение PB , используйте:

Debugger.Break()

Но также помните, что после запуска службы вы можете подключить VS.NET к запущенному процессу службы и установить точки останова. Конечно, если код в точке останова срабатывает автоматически, вам нужно будет быстро присоединиться, но в моем случае моя служба обрабатывает запросы, поэтому я присоединяюсь к службе и запускаю запрос.

0 голосов
/ 18 марта 2016

Чтение Отладка .Net Windows Service «простым способом» . В этой статье Марк Пирс описывает, как отладить службу Windows .Net из Visual Studio. По сути, это сводится к следующему фрагменту кода, но прочитайте статью для полного решения.

Shared Sub Main()
#If DEBUG Then
    Dim DebugService As New ServiceAdmin
    DebugService.OnStart(Nothing)
#Else
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase
    ServicesToRun = New System.ServiceProcess.ServiceBase() {New ServiceAdmin()}
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
#End If
End Sub
...