2011-03-01 39 views
21

que desea depurar un servicio de Windows, sino que aparece un mensaje de error que diceejecutar un servicio de Windows como una aplicación de consola

No se puede iniciar el servicio de la línea de comandos o un depurador. Se debe instalar un servicio de Windows utilizando installutil.exe y luego se inició con el Explorador del servidor, servicios de Windows Herramientas administrativas o el comando NET start .

Realmente no tengo ninguna idea acerca de este error .....

enter image description here

+4

Podría haber jurado que [acabo de ver un post como este] (http://stackoverflow.com/questions/5156427/how-do-you-debug -a-windows-service) –

Respuesta

32

Antes de que un servicio de Windows puede funcionar, tiene que ser "instalado" en primer lugar utilizando installutil. EG:

C:\installutil -i c:\path\to\project\debug\service.exe 

Luego puede abrir la lista de Servicios para iniciarlo. EG:

  1. Haga clic derecho en 'Mi PC'
  2. Haga clic en 'Gestionar'
  3. Abran 'Servicios y Aplicaciones'
  4. Haga clic en 'Servicios'
  5. Encuentra su servicio en la lista y haga clic derecho en él
  6. Haga clic en 'Inicio'

Una vez que se ha iniciado, se puede entrar en Visual Stu dio, haga clic en 'Depurar', luego haga clic en 'Adjuntar al proceso'.

Otra técnica consiste en añadir esta línea a su método OnStart() en el servicio:

System.Diagnostics.Debugger.Launch(); 

Cuando se hace esto, se solicita al usuario escoger una instancia de Visual Studio para depurar el servicio en .

+1

Como un lado, me parece que crear un instalador con lo siguiente en el método 'OnCommitted' funciona muy bien:' using (ServiceController sc = new ServiceController (__ SERVICENAME __)) {sc.Start();} ' (o puede comenzar manualmente como se describe). –

+1

Lo siento pero no puedo hacer esto C: \ installutil -i c: \ path \ to \ project \ debug \ service.exe – pinki

+0

manasareddy, ¿qué sucede cuando lo intentas? –

13

se puede modificar modo de inicio de la asamblea en función de si está en el modo de depuración (por lo general dentro de Visual Studio, pero no necesariamente) o el modo de descarga (cuando se ejecuta como un servicio en la producción):

Cambie este :

static class Program 
{ 
    static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 

a que:

static class Program 
{ 
    static void Main() 
    { 
     #if(!DEBUG) 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new MyService() 
      }; 
      ServiceBase.Run(ServicesToRun); 
     #else 
      MyService myServ = new MyService(); 
      myServ.Process(); 
      // here Process is my Service function 
      // that will run when my service onstart is call 
      // you need to call your own method or function name here instead of Process(); 
     #endif 
    } 
} 

La técnica se ha tomado de this article y el crédito es para el autor del artículo, Tejas vaishnava. Copié los fragmentos de código aquí porque SO prefiere las respuestas completas en lugar de los enlaces que podrían desaparecer en algún momento.

+0

Entonces, ¿esto solo ejecutará myServ.Process() y saldrá? –

+0

Básicamente. Es su responsabilidad mantenerlo ocupado. –

+0

Mi punto es que no es lo mismo que ejecutar un servicio. –

1

Compruebe si se encuentra en modo "DEPURAR" o "LIBERAR". Obtuve este error cuando estaba tratando de depurar el servicio en el modo "RELEASE". Cuando cambié eso a "DEPURAR", todo funcionó bien.

Esto es después de haber instalado correctamente el servicio como lo sugirieron otras personas arriba.

0

Tengo el mismo error. Intenté @C.La solución de Lawrence. Aunque encontré que mi servicio se está ejecutando en la Lista de servicios pero aún tengo el mismo error. He leído un blog que sugiere Adjuntar al proceso en el Menú de depuración y he aquí que no veo mi servicio en la lista de procesos.

Agradecería sugerencias para una posible solución sobre este tema.

Gracias.

+1

esto no debería ser una respuesta. debería ser un comentario o una pregunta nueva (si no hay una pregunta como esta) – Joshua

+0

sí, el problema es que soy nuevo en este lugar y no pude comentar hasta que obtuve 50 puntos o algo así? Perdón por desordenar. Gracias por el comentario de todos modos. – CodeJammer

+0

Creo que necesita estar ejecutándose con privilegios de administrador para adjuntarlo a un proceso de servicio. Debería poder verificar el PID usando 'sc queryex ' desde un símbolo del sistema del administrador. También puede hacer clic en el encabezado de la columna PID en la pantalla adjuntar al proceso para ordenar por PID. –

1

Para evitar que se produzca este error y permitir que el servicio se ejecute fuera del controlador de servicio habitual, puede marcar Environment.UserInteractive. Si está configurado, puede ejecutar el servicio con salida a la consola en lugar de dejar que se ejecute en el código ServiceBase que devuelve ese error.

Esto, unido al inicio de Program.Main(), antes de que el código que utiliza ServiceBase para ejecutar el servicio:

 if (Environment.UserInteractive) 
     { 
      var service = new WindowsService(); 
      service.TestInConsole(args); 
      return; 
     } 

A medida que el OnStart y métodos OnStop son protected en su servicio que necesita añadir otro método de la clase que se puede ejecutar desde main() y llama a esos métodos para usted, tales como:

public void TestInConsole(string[] args) 
    { 
     Console.WriteLine($"Service starting..."); 
     this.OnStart(args); 
     Console.WriteLine($"Service started. Press any key to stop."); 
     Console.ReadKey(); 
     Console.WriteLine($"Service stopping..."); 
     this.OnStop(); 
     Console.WriteLine($"Service stopped. Closing in 5 seconds."); 
     System.Threading.Thread.Sleep(5000); 
    } 

por último, asegúrese de que la salida es una aplicación de consola en las propiedades del proyecto.

Ahora puede ejecutar el servicio ejecutable como cualquier otro y se iniciará como una consola. Si lo inicia desde Visual Studio, el depurador se adjuntará automáticamente. Si lo registra y lo inicia como un servicio, se ejecutará correctamente como un servicio sin ningún cambio.

La única diferencia que he encontrado es que cuando se ejecuta como una aplicación de consola, el código no se escribe en el registro de eventos, es posible que desee mostrar cualquier cosa que normalmente se registre allí a la consola.

Esta técnica de depuración servicio es uno de los que se explica en docs.microsoft.com

+0

La documentación de Microsoft está mejorando, gracias por agregar el enlace. – dare2k

Cuestiones relacionadas