Более простой способ отладки службы Windows - PullRequest
313 голосов
/ 24 сентября 2008

Есть ли более простой способ пошагового выполнения кода, чем запуск службы через диспетчер управления службами Windows и последующее присоединение отладчика к потоку? Это довольно громоздко, и мне интересно, есть ли более простой подход.

Ответы [ 28 ]

1 голос
/ 28 апреля 2009

Я использую вариант ответа JOP. Используя параметры командной строки, вы можете установить режим отладки в IDE со свойствами проекта или через диспетчер служб Windows.

protected override void OnStart(string[] args)
{
  if (args.Contains<string>("DEBUG_SERVICE"))
  {
    Debugger.Break();
  }
  ...
}
1 голос
/ 14 марта 2018
static class Program
{
    static void Main()
    {
        #if DEBUG

        // TODO: Add code to start application here

        //    //If the mode is in debugging
        //    //create a new service instance
        Service1 myService = new Service1();

        //    //call the start method - this will start the Timer.
        myService.Start();

        //    //Set the Thread to sleep
        Thread.Sleep(300000);

        //    //Call the Stop method-this will stop the Timer.
        myService.Stop();

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

        ServiceBase.Run(ServicesToRun);
         #endif
    }
}
1 голос
/ 04 января 2017

Вот простой метод, который я использовал для тестирования сервиса, без каких-либо дополнительных методов «отладки» и с интегрированными VS Unit Tests.

[TestMethod]
public void TestMyService()
{
    MyService fs = new MyService();

    var OnStart = fs.GetType().BaseType.GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

    OnStart.Invoke(fs, new object[] { null });
}

// As an extension method
public static void Start(this ServiceBase service, List<string> parameters)
{
     string[] par = parameters == null ? null : parameters.ToArray();

     var OnStart = service.GetType().GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

     OnStart.Invoke(service, new object[] { par });
}
1 голос
/ 02 мая 2016

Используйте проект шаблона службы Windows C # для создания нового приложения службы https://github.com/HarpyWar/windows-service-template

Имеются режим автоматического определения консоли / службы, автоустановщик / деинсталлятор службы и несколько наиболее часто используемых функций.

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

Просто поместите свой обед отладчика в любое место и присоедините Visualstudio при запуске

#if DEBUG
    Debugger.Launch();
#endif

Также вам нужно запустить VS от имени администратора и разрешить, чтобы процесс мог автоматически отлаживаться другим пользователем (как объяснено здесь ):

reg add "HKCR\AppID{E62A7A31-6025-408E-87F6-81AEB0DC9347}" /v AppIDFlags /t REG_DWORD /d 8 /f
0 голосов
/ 16 марта 2018

Лучший вариант - использовать пространство имен ' System.Diagnostics '.

Включите ваш код в блок if else для режима отладки и режима выпуска, как показано ниже для переключения между режимом отладки и выпуска в Visual Studio,

#if DEBUG  // for debug mode
       **Debugger.Launch();**  //debugger will hit here
       foreach (var job in JobFactory.GetJobs())
            {
                //do something 
            }

#else    // for release mode
      **Debugger.Launch();**  //debugger will hit here
     // write code here to do something in Release mode.

#endif
0 голосов
/ 16 марта 2017

Просто вставьте

Debugger.Break();

в любом месте вашего кода.

Например,

internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        private static void Main()
        {
            Debugger.Break();
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new Service1()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }

Когда вы запустите вашу программу, она наберет Debugger.Break();.

0 голосов
/ 21 июля 2015

У вас есть два варианта отладки.

  1. создать файл журнала. Лично я предпочитаю отдельный файл журнала, такой как текстовый файл, а не журнал приложений или журнал событий. Но это будет стоить вам дорого за время, потому что все еще трудно понять, где именно ошибка расположение
  2. Преобразование приложения в консольное приложение: это позволит вам все инструменты отладки, которые мы можем использовать в VS.

Пожалуйста, обратитесь к ЭТОМУ сообщению в блоге, которое я создал для этой темы.

...