27

Cómo ejecutar un proyecto de servicio de Windows desde Visual Studio.cómo ejecutar (F5) el servicio de Windows desde el estudio visual

Estoy construyendo un servicio de Windows en Visual Studio 2008, siempre tengo que ejecutar el servicio desde el panel de control y luego adjuntar el depurador a la instancia en ejecución del servicio. Es algo molesto ya que estoy limpiando una gran cantidad de código y necesito reiniciar mi servicio muchas veces durante el desarrollo.

Quiero configurar mi proyecto para poder presionar F5 y ejecutar el servicio e ingresar directamente al modo de depuración. Algunos consejos sobre cómo lograr esto serían geniales.

Gracias de antemano!

+0

Mira este artículo http://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx. También se refiere a los siguientes artículos: http://msdn.microsoft.com/en-us/library/htkdfk18(v=vs.80).aspx http://msdn.microsoft.com/en-us /library/ddhy0byf(v=vs.80).aspx –

Respuesta

6

En su rutina Main() compruebe Debugger.IsAttached y si es verdad, inicie su aplicación como si fuera una consola, de lo contrario, llame al ServiceBase.Run().

2

Cree un proyecto separado que solo haga referencia al proyecto del servicio e instale e inicie el servicio. Simplemente funciona como una aplicación normal y puedes acceder a ella.

YourService s = new YourService(); 
s.Start(); 
25

Copied from here.

static void Main(string[] args) 
{ 
    DemoService service = new DemoService(); 

    if (Environment.UserInteractive) 
    { 
     service.OnStart(args); 
     Console.WriteLine("Press any key to stop program"); 
     Console.Read(); 
     service.OnStop(); 
    } 
    else 
    { 
     ServiceBase.Run(service); 
    } 
} 

Esto debería permitir ejecutar desde Visual Studio.

Otra forma sería insertar un punto de interrupción programático en su código llamando al System.Diagnostics.Debugger.Break(). Cuando coloca esto en, por ejemplo, la devolución de llamada OnStart() de su servicio y comienza su servicio desde la consola de Servicios, el punto de interrupción programático activará un cuadro de diálogo que le permite conectarse a una instancia existente de Visual Studio o iniciar un nuevo ejemplo. Este es realmente el mecanismo que utilizo para depurar mi servicio.

+3

Las instrucciones en ese enlace funcionan perfectamente para mí. ¡Gracias! –

+0

Solo digo, en Windows 8, parece que han hecho algunos cambios a los servicios de Windows y reducen mucho su capacidad para hacer cosas interactivas. Debugger.Launch() y Debugger.Break() ya no parecen desencadenar el diálogo GUI que le permitió elegir e IDE para depurar, por lo que el servicio simplemente se cuelga. FYI –

2

Sólo tiene que llamar al evento OnStart() desde el constructor servicio

lo hice de la siguiente manera

public XXX() 
    { 
     InitializeComponent(); 
     OnStart(new string[] { "shafi", "moshy" }); 
    } 
0

usted quiere tener su servicio de Windows como una concha, debe haber un nivel de código en allí para que no tengas que probarlo.

Debería tener todo lo que desea que su servicio haga en una clase.

Puede probar la clase por su unidad y, si funciona, hacer referencia a su servicio.

De esta forma, cuando haga que su clase haga todo lo que desee, cuando se aplique a su servicio, todo debería funcionar. :)

Un registro de eventos puede ver lo que está haciendo su servicio mientras se está ejecutando, también es una buena manera de probar: D intentar eso.

namespace WindowsService 
{ 
    public partial class MyService : ServiceBase 
    { 
     public MyEmailService() 
     { 
      InitializeComponent(); 
      if (!System.Diagnostics.EventLog.SourceExists("MySource")) // Log every event 
      { 
       System.Diagnostics.EventLog.CreateEventSource(
        "MySource", "MyNewLog"); // Create event source can view in Server explorer 
      } 
      eventLogEmail.Source = "MySource"; 
      eventLogEmail.Log = "MyNewLog"; 

      clsRetriveEmail Emails = new clsRetriveEmail(); 
      eventLogEmail.WriteEntry("Populateing database with mail"); // log event 
      Emails.EmailGetList(); // Call class 
     } 
     protected override void OnStart(string[] args) 
     { 
      eventLogEmail.WriteEntry("Started"); 
     } 
     protected override void OnStop() 
     { 
      eventLogEmail.WriteEntry("Stopped"); 
     } 
     protected override void OnContinue() 
     {  
      eventLogEmail.WriteEntry("Continuing"); 
     } 
     } 
    } 
0

Estos enlaces pueden ser muy útiles cuando se trabaja con servicios.

Se trata de un paseo, aunque en la creación de ellos http://msdn.microsoft.com/en-us/library/zt39148a.aspx

James Michael Hare ha en su blog http://geekswithblogs.net/BlackRabbitCoder/ escrito sobre una plantilla muy agradable/marco que ha hecho, por lo que es mucho más fácil de desarrollar (y depuración) de servicios de Windows : C# Caja de herramientas: Un depurable, plantilla de servicio de Windows con instalación automática (1 de 2) http://geekswithblogs.net/BlackRabbitCoder/archive/2010/09/23/c-windows-services-1-of-2-creating-a-debuggable-windows.aspx

le proporciona todos los elementos básicos que necesita para empezar a trabajar rápidamente. Y lo mejor de todo es que le ofrece una manera realmente agradable de depurar su servicio como si fuera una aplicación de consola normal. También podría mencionar que proporciona una funcionalidad lista para instalar (y desinstalar) su servicio. La segunda parte de la publicación se puede encontrar en este enlace.

He usado esto un par de veces, y realmente puedo recomendarlo.

3

Es posible configurar un proyecto complementario para el Servicio de Windows que se ejecuta como una aplicación de consola, pero accede a los métodos de servicio utilizando Reflection. Vea aquí para más detalles y un ejemplo: http://ryan.kohn.ca/articles/how-to-debug-a-windows-service-in-csharp-using-reflection/.

Este es el código relevante que usted necesita en la aplicación de consola:

using System; 
using System.Reflection; 

namespace TestableWindowsService 
{ 
    class TestProgram 
    { 
    static void Main() 
    { 
     Service1 service = new Service1(); 

     Type service1Type = typeof (Service1); 

     MethodInfo onStart = service1Type.GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Instance); //retrieve the OnStart method so it can be called from here 

     onStart.Invoke(service, new object[] {null}); //call the OnStart method 
    } 
    } 
} 
2

También puede hacer esto: (Ver comentarios para explicación)

public class Program : ServiceBase 
{ 
    private ServiceHost _serviceHost = null; 
    public Program() 
    { 
     ServiceName = ""; 
    } 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
       #if(!DEBUG) 
       // when deployed(built on release Configuration) to machine as windows service use this 
        ServiceBase[] ServicesToRun; 
        ServicesToRun = new ServiceBase[] { new Program() }; 
        ServiceBase.Run(ServicesToRun); 
       #else 
       // when debugging use this (When debugging after building in Debug Configuration) 
       //If you want the DEBUG preprocessor constant in Release you will have to check it on in the project configuration 
       Program progsvc = new Program(); 
       progsvc.OnStart(new string[] { }); 
       System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); 
       #endif       
    } 
    protected override void OnStart(string[] args) 
    { 
       // Start Web Service 
       if (_serviceHost != null) 
       { 
        _serviceHost.Close(); 
       } 
       _serviceHost = new ServiceHost(typeof(Namespace.Service)); 
       _serviceHost.Open(); 
    }  
} 
Cuestiones relacionadas