Подтвердить что ты не робот

Отладка службы Windows

Сценарий

У меня есть служба Windows, написанная на С#. Я прочитал все потоки google о том, как отлаживать его, но я все еще не могу заставить его работать. Я запустил "PathTo.NetFramework\InstallUtil.exe C:\MyService.exe". Он сказал, что установка прошла успешно, однако когда я запускаю "Services.msc", служба вообще не отображается вообще. Если я зашел в диспетчер задач, появится процесс под названием "MyService.vshost.exe". Довольно уверен, что не это, потому что это услуга, а не процесс.

Может ли кто-нибудь объяснить мне?

Если я должен видеть службу при запуске Services.msc? (Принимая во внимание, что все это делается на локальной машине без серверов AT ALL.

Другие

Я запускаю VS2008.

EDIT:

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

ИЗМЕНИТЬ 2:

НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ! Каждый раз, когда я пытаюсь что-то получить, я получаю сообщение о необходимости использования NET START или установки службы.

ИЗМЕНИТЬ 3:

Я запускаю VS2008.

Я набрал это: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\dev\Restarter\bin\Release\Restarter.exe

Я получил это: Утилита для установки Microsoft.NET Framework.NET 2.0.050727.3053 Copyright (c) Корпорация Microsoft. Все права защищены.

Запуск транзакционной установки.

Начало этапа установки. См. Содержимое файла журнала для C:\dev\Restarter\bin \ Выпуск \Restarter.exe. Файл находится в каталоге C:\dev\Restarter\bin\Release\EDT.Restar ter.InstallLog. Установка сборки 'C:\dev\Restarter\bin\Release\Restarter.exe'. Затронутыми параметрами являются:  logtoconsole =  assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe  logfile = C:\dev\Restarter\bin\Release\Restarter.InstallLog

Фаза установки успешно завершена, и начинается фаза фиксации. См. Содержимое файла журнала для C:\dev\Restarter\bin \ Выпуск \Restarter.exe. Файл находится в каталоге C:\dev\Restarter\bin\Release\Restar ter.InstallLog. Committing assembly 'C:\dev\Restarter\bin\Release\Restarter.exe'. Затронутыми параметрами являются:  logtoconsole =  assemblypath = C:\dev\Restarter\bin\Release\Restarter.exe  logfile = C:\dev\Restarter\bin\Release\Restarter.InstallLog

Успешная фаза завершена.

Завершенная транзакция завершена.

C:\Program Files\Microsoft Visual Studio 9.0\VC >

Затем я пошел в RUN → Services.msc Я ничего не вижу там.

В диспетчере задач есть процесс "Restarter.vshost.exe".

Что это.

Я только хотел установить и отладить его. Я знаю, что он работает (поскольку он работает и не падает). Но код был написан другом, и я хочу понять базовый код, пройдя его в режиме отладки.

4b9b3361

Ответ 1

Я рекомендую следующий шаблон для отладки:

 var ServiceToRun = new SomeService(); 
 if (Environment.UserInteractive)
 {
    // This used to run the service as a console (development phase only)

    ServiceToRun.Start();

    Console.WriteLine("Press Enter to terminate ...");
    Console.ReadLine();

    ServiceToRun.DoStop();
 }
 else
 {
    ServiceBase.Run(ServiceToRun);
 }

Изменить: убедитесь, что вашей целью является консольное приложение, а не приложение Windows, иначе оно не будет работать.

Ответ 2

вы можете отладить его, присоединив отладчик к процессу. Вы можете сделать это, добавив строку к запуску вашей программы:

Debugger.Launch ();

после добавления оператора using:

using System.Diagnostics; 

вам нужно либо поместить это в условный блок, либо удалить его, когда вы закончите отладку

либо запустив службу, а затем подключившись к процессу вручную из среды IDE: Debug- > Attach to process..

Ответ 3

Мы можем отлаживать проект проекта Windows, просто добавляя параметр и делая его похожим на консольное приложение.

1) Перейдите к свойствам проекта службы Windows → Отладка → Параметры запуска 2) Дайте аргумент - Консоль 3) Перейдите на вкладку Приложения → тип вывода, измените его на Консольное приложение 4) Введите код ниже в Program.cs

static class Program
    {
        private static EventWaitHandle _waitHandle;
        private static Service1 _service;
                static void Main(string[] args)
        {
            bool runConsole = false;**

            foreach (string arg in args)
            {
                if (arg.ToLowerInvariant().Equals("-console"))
                {
                    runConsole = true;
                }
            }   

            _service = new Service1();
            if (runConsole)
            {
                _waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                Console.WriteLine("Starting Workflow Service in Console Mode");
                Console.WriteLine("Press Ctrl+C to exit Console Mode");
               Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
                _service.InternalStart();
                WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
            }

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

        static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            _service.InternalStop();
            _waitHandle.Set();
        }


    }

Ответ 4

Это очень помогло мне при разработке/отладке служб Windows:

http://windowsservicehelper.codeplex.com/

Просто нажмите F5 для отладки. Очень просто.

Андрей тоже очень хорош.

Ответ 5

Чтобы иметь возможность отлаживать мой сервис без его развертывания, я всегда пишу его следующим образом:

В файле program.cs:

#if DEBUG
    MyService myService = new MyService();
    myService.OnDebug();
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
        new MyService()
    };
    ServiceBase.Run(ServicesToRun);
#endif

и в файле MyService.cs:

    public void OnDebug()
    {
        OnStart(null);
    }

* ПРИМЕЧАНИЕ *. Вы должны построить в режиме "Release", когда вы, наконец, закончите работу с отладкой, и готовы к развертыванию службы, иначе служба не будет считаться сервисом.

Надеюсь, что это поможет.

Ответ 6

Предположения:

1) У вас есть исходный код, доступный в решении в VS2008 IDE

Как отлаживать службы С#:

  • Установите службу с помощью InstallUtil. (Кажется, вы уже это сделали)
  • (если необходимо) Измените путь службы на файл MyService.exe, который создается в папке Solution bin
  • Поместите в начало своего сервиса OnStart() что-то вроде следующего:

    while(true)
    {
       System.Threading.Thread.Sleep(500);
    }
    
  • Поместите точку останова на System.Threading.Thread.Sleep(500)

  • Постройте решение

  • Запустите службу, используя Утилита Windows Service Utility

  • Пока ваша служба запускается, в VS2008 goto Debug -> Attach To Processes...

  • Убедитесь, что отмечены Show Processes From All Users и Show Processes In All Sessions

  • Найдите ваш MyService.exe в списке и нажмите Attach

  • Теперь вы должны быть в точке останова, которую вы вставили в бесконечный цикл

  • Перетащите элемент управления (желтая стрелка) прямо за бесконечный цикл

  • Откажитесь!

Отказ от ответственности:

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

Ответ 7

Возможно, это имя службы не то, что вы ожидаете, и почему вы не можете его найти. Имя службы определяется в свойствах ServiceInstaller в .NET-проекте и не должно каким-либо образом соответствовать имени исполняемого файла. Но если вы уверены, что служба не указана после установки, вот что вы можете сделать.

Во-первых, установка сервиса. Существует 2 метода: InstallUtil.exe и SC.exe. Первый из них специально предназначен для служб .NET, поскольку он будет запускать все ProjectInstaller и ServiceInstaller. Во-вторых, это не будет сделано, но это даст вам больше возможностей и, как правило, более эффективно, т.е. Может преуспеть там, где InstallUtil терпит неудачу. Это может быть, когда в любом коде установщика есть исключение.

Вы уже пробовали установить с помощью InstallUtil, поэтому здесь SC версия:

sc create MyService binPath= "C:\Service.exe"

Обратите внимание, что MyService - это имя вы, предоставляющее услугу в этот момент, и это может быть что угодно (в пределах разумного:-). Это имя будет отображаться в списке консолей служб.

После того, как вы установили свою службу, вам нужно будет отладить ее сразу, когда вызывается OnStart. Это может быть достигнуто путем запуска и присоединения к отладчику (Visual Studio) из службы:

protected override void OnStart(string[] args)
{
    #if DEBUG
    Debugger.Launch();
    #endif
    ...
}

Не забывайте создавать и заменять исполняемый файл службы после этого изменения кода. Служба должна быть остановлена, но ее не нужно удалять и переустанавливать.

Чтобы удалить службу с помощью SC:

sc delete MyService

Ответ 8

Если ваш бизнес-уровень отделен от службы Windows, вы можете протестировать все свои бизнес-функции за пределами службы Windows.

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

System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
service1.Start();

Ответ 9

Недавно я добавил это в проект, и он отлично работает для меня. Вы можете отлаживать его так же, как и любой другой EXE. После его добавления перейдите к своим свойствам проекта и добавьте параметр командной строки (/EXE) на вкладке "Отладка" для конфигурации сборки Debug.

<MTAThread()> _
Shared Sub Main()

    '' 
    '' let add a command line parameter so we can run this as a regular exe or as a service
    ''
    If Command().ToUpper() = "/EXE" Then
        Dim app As MyService = New MyService()

        app.OnStart(Nothing)
        Application.Run()
    Else
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase

        ' More than one NT Service may run within the same process. To add
        ' another service to this process, change the following line to
        ' create a second service object. For example,
        '
        '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
        '
        ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService}

        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End If
End Sub

Ответ 10

Я рекомендую добавить /test на вкладку отладки свойств проекта в качестве параметра запуска. Затем вы можете запустить службу без необходимости ее установки.

Ответ 11

Если вы создаете свою службу с помощью TopShelf, вы сможете легко отладить ее из Visual Studio