studio - windows service debug onstart c#
Depurar el servicio de Windows (11)
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 intento 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 programa / 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.
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 compilar 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.
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();
}
}
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 compilar 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
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 compilación de depuración.
<MTAThread()> _
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.
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 objetivo sea la aplicación de consola, no la aplicación de Windows, de lo contrario no funcionará.
Si crea su servicio con TopShelf, debería poder depurarlo fácilmente desde Visual Studio
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();
puede depurarlo adjuntando el depurador al proceso. Puede hacer esto agregando una línea al inicio de su programa:
Debugger.Launch ();
después de agregar la declaración 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 ...
Suposiciones
1) Tiene el código fuente disponible en una Solución en el IDE VS2008
Cómo debo depurar los servicios de C #:
- Instala el servicio usando
InstallUtil
. (Parece que ya has hecho eso) - (Si es necesario) Cambie la ruta del servicio a MyService.exe que se produce en la carpeta
bin
su Solución Coloque algo como lo siguiente al comienzo del método
OnStart()
de su Servicio:while(true) { System.Threading.Thread.Sleep(500); }
Poner un punto de interrupción en
System.Threading.Thread.Sleep(500)
Construye la solución
Comience su servicio usando la utilidad de servicio de Windows
Mientras se inicia su Servicio, en VS2008 vaya a
Debug -> Attach To Processes...
Asegúrese de que se
Show Processes From All Users
yShow Processes In All Sessions
Busque su MyService.exe en la lista y haga clic en
Attach
Ahora debería estar en el punto de interrupción que insertó en el ciclo infinito
Arrastra el control (flecha amarilla) justo fuera del bucle infinito
Debug away!
Renuncia:
Recuerde eliminar el bucle infinito cuando desee liberar una compilación, o cuando simplemente desee ejecutar el servicio normalmente.