A veces nos interesa hacer debug de un servicio de windows. Pero normalmente esto se hace complicado porque un servicio de windows no corre dentro de Visual Studio .NET porque es necesario instalarlo y registrarlo (installutil.exe y NET START).

Una manera cómoda y sencilla es añadir al metodo estático Main una directiva de compilación para diferenciar el modo debug del modo release, de manera que si estamos en debug iniciar el servicio Windows como una aplicación normal:

#if (!DEBUG)
  ServiceBase[] ServicesToRun;
  ServicesToRun = new ServiceBase[] { new MiWService() };
  ServiceBase.Run(ServicesToRun);
#else
  MiWService service = new MiWService();
  service.Init();
  System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#endif

Por último, en la clase de tipo MiWService (que hereda de ServiceBase) escribir un método Init() que llame al método proteced OnStart():

public void Init()
{
  this.OnStart(null);
}

Para información mas detallada consultar aquí