Отладка службы 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".
Что это.
Я только хотел установить и отладить его.
Я знаю, что он работает (поскольку он работает и не падает).
Но код был написан другом, и я хочу понять базовый код, пройдя его в режиме отладки.
Ответы
Ответ 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