Depurar el servicio de Windows

Guión

Tengo un servicio de Windows escrito en C #. He leído todos los hilos de google sobre cómo depurarlo, pero todavía no puedo hacerlo funcionar. He ejecutado “PathTo.NetFramework \ InstallUtil.exe C: \ MyService.exe”. Dijo que la instalación fue exitosa, sin embargo, cuando ejecuto “Services.msc”, el servicio no se muestra en absoluto, en ninguna parte. Si voy al Administrador de tareas, hay un proceso llamado “MyService.vshost.exe”. Estoy bastante seguro de que no es así, porque es un servicio, no un proceso.

¿Alguien me puede explicar?

Si se supone que debo ver el servicio cuando ejecuto Services.msc? (Teniendo en cuenta que todo esto se hace en una máquina local, sin ningún servidor en absoluto).

Otro

Estoy ejecutando VS2008.

EDITAR:

Todo esto se está haciendo en mi máquina local, no tengo servidores ni acceso a ninguno. Además, ni siquiera sé lo que hace el servicio, quiero depurarlo para poder recorrer el código y ver cómo funciona todo (el código dentro del servicio, no el servicio en sí, para cualquiera de ustedes, pantalones inteligentes que podrían sugiero que mire una plantilla).

EDICION 2:

¡NINGUNO DE ESTOS ESTÁN TRABAJANDO! Cada vez que bash algo, recibo un mensaje acerca de tener que usar NET START o instalar el servicio.

EDIT 3:

Estoy ejecutando VS2008.

Escribí esto: C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe C: \ dev \ Restarter \ bin \ Release \ Restarter.exe

Obtuve esto: Microsoft (R) .NET Framework Installation utility Version 2.0.50727.3053 Copyright (c) Microsoft Corporation. Todos los derechos reservados.

Ejecutando una instalación transaccionada.

Comenzando la fase de instalación de la instalación. Vea el contenido del archivo de registro para el progreso del ensamblado C: \ dev \ Restarter \ bin \ Release \ Restarter.exe. El archivo se encuentra en C: \ dev \ Restarter \ bin \ Release \ EDT.Restar ter.InstallLog. Instalación del ensamblado ‘C: \ dev \ Restarter \ bin \ Release \ Restarter.exe’. Los parámetros afectados son: logtoconsole = assemblypath = C: \ dev \ Restarter \ bin \ Release \ Restarter.exe logfile = C: \ dev \ Restarter \ bin \ Release \ Restarter.InstallLog

La fase de instalación se completó con éxito, y la fase de compromiso está comenzando. Vea el contenido del archivo de registro para el progreso del ensamblado C: \ dev \ Restarter \ bin \ Release \ Restarter.exe. El archivo se encuentra en C: \ dev \ Restarter \ bin \ Release \ Restar ter.InstallLog. Conjunto de compromiso ‘C: \ dev \ Restarter \ bin \ Release \ Restarter.exe’. Los parámetros afectados son: logtoconsole = assemblypath = C: \ dev \ Restarter \ bin \ Release \ Restarter.exe logfile = C: \ dev \ Restarter \ bin \ Release \ Restarter.InstallLog

La fase de compromiso se completó con éxito.

La instalación realizada ha finalizado.

C: \ Archivos de progtwig \ Microsoft Visual Studio 9.0 \ VC>

Luego fui a RUN -> Services.msc No puedo ver nada allí.

Hay un proceso en el Administrador de tareas llamado “Restarter.vshost.exe”.

Eso es.

Solo quería instalarlo y depurarlo. Sé que funciona (ya que funciona y no se cuelga). Pero el código fue escrito por un amigo y quiero entender el código subyacente al recorrerlo en modo de depuración.

Recomiendo seguir el patrón para la depuración:

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

Editar: asegúrese de que su objective sea la aplicación de consola, no la aplicación de Windows, de lo contrario no funcionará.

puede depurarlo adjuntando el depurador al proceso. Puede hacer esto agregando una línea al inicio de su progtwig:

 Debugger.Launch (); 

después de agregar la statement de uso:

 using System.Diagnostics; 

deberás poner eso en un bloque condicional o eliminarlo cuando hayas terminado de depurar

o ejecutando el servicio y luego adjuntándolo al proceso manualmente desde el IDE: Depurar-> Adjuntar para procesar …

Podemos depurar el proyecto del servicio de Windows simplemente agregando un parámetro y haciendo que se comporte como una aplicación de consola.

1) Vaya a las propiedades de su proyecto de servicio de Windows -> Depuración -> Opciones de inicio 2) Proporcione un argumento -Consola 3) Vaya a la pestaña Aplicación -> tipo de salida, cámbielo a la Aplicación de consola 4) Escriba el siguiente código en 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(); } } 

Esto me ha ayudado mucho al desarrollar / depurar servicios de Windows:

http://windowsservicehelper.codeplex.com/

Simplemente presione F5 para depurar. Muy fácil.

El enfoque de Andrey también es muy bueno.

Para poder depurar mi servicio sin implementarlo, siempre lo escribo de la siguiente manera:

En su archivo 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 

y en su archivo MyService.cs:

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

* NOTA * : debe comstackr en modo ‘Liberar’ cuando haya terminado con la depuración y esté listo para implementar el servicio; de lo contrario, el servicio no se considerará como un servicio.

Espero que esto ayude.

Suposiciones

1) Tiene el código fuente disponible en una Solución en el IDE VS2008

Cómo debo depurar los servicios de C #:

  1. Instala el servicio usando InstallUtil . (Parece que ya has hecho eso)
  2. (Si es necesario) Cambie la ruta del servicio a MyService.exe que se produce en la carpeta bin su Solución
  3. Coloque algo como lo siguiente al comienzo del método OnStart() de su Servicio:

     while(true) { System.Threading.Thread.Sleep(500); } 
  4. Poner un punto de interrupción en System.Threading.Thread.Sleep(500)

  5. Construye la solución

  6. Comience su servicio usando la utilidad de servicio de Windows

  7. Mientras se inicia su Servicio, en VS2008 vaya a Debug -> Attach To Processes...

  8. Asegúrese de que se Show Processes From All Users y Show Processes In All Sessions

  9. Busque su MyService.exe en la lista y haga clic en Attach

  10. Ahora debería estar en el punto de interrupción que insertó en el ciclo infinito

  11. Arrastra el control (flecha amarilla) justo fuera del bucle infinito

  12. Debug away!

Renuncia:

Recuerde eliminar el bucle infinito cuando desee liberar una comstackción, o cuando simplemente desee ejecutar el servicio normalmente.

Puede ser que el nombre del servicio no sea el que esperas y es por eso que no puedes encontrarlo. El nombre del servicio se define en ServiceInstaller propiedades de ServiceInstaller en el proyecto .NET y no tiene que corresponder con el nombre del ejecutable de ninguna manera. Pero si está seguro de que el servicio no figura en la lista después de la instalación, esto es lo que puede hacer.

Primero, instalación de servicio. Hay 2 métodos, InstallUtil.exe y SC.exe . El primero está diseñado específicamente para servicios .NET ya que ejecutará todos los ProjectInstaller y ServiceInstaller . El segundo no hará eso, pero le dará más opciones y, por lo general, es más efectivo, es decir, es probable que tenga éxito donde falla InstallUtil . Esto puede ser cuando hay una excepción en cualquier código de instalador.

Ya has intentado instalar con InstallUtil así que aquí está la versión SC :

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

Tenga en cuenta que MyService es el nombre que le da al servicio en este punto y puede ser lo que quiera (dentro de lo razonable :-). Este nombre se mostrará en la lista de consola de servicios.

Una vez que tenga su servicio instalado, deberá depurarlo justo cuando se OnStart . Esto se puede lograr ejecutando y adjuntando a un depurador (Visual Studio) desde el servicio:

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

No te olvides de comstackr y reemplazar el ejecutable del servicio después de este cambio de código. El servicio debe detenerse, pero no es necesario desinstalarlo ni volver a instalarlo.

Para eliminar el servicio usando SC :

 sc delete MyService 

Si su capa empresarial está separada del servicio de Windows, puede probar todas las funciones de su negocio fuera de ejecutar el servicio de Windows.

Para probar el servicio de Windows, me gusta crear un proyecto de prueba que sea una aplicación de consola y empiezo un nuevo hilo que ejecuta mi servicio.

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

Recientemente agregué esto a un proyecto y me fue muy bien. Puede depurarlo como cualquier otro EXE. Después de agregarlo, vaya a las propiedades de su proyecto y agregue un parámetro de línea de comando (/ EXE) en la pestaña Depuración para la configuración de comstackción de depuración.

  _ Shared Sub Main() '' '' let's 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 

Recomiendo agregar /test en la pestaña de depuración de propiedades del proyecto como una opción de inicio. Luego puede ejecutar su servicio sin tener que instalarlo.

Si crea su servicio con TopShelf, debería poder depurarlo fácilmente desde Visual Studio