visual studio servicio puede llamar linea iniciar dinamicamente desde depurador crear controles comandos agregar c# windows-services

studio - C#inicia el servicio de Windows mediante programación



llamar un servicio windows desde c# (6)

Tengo un problema con una aplicación que estoy creando. Estoy tratando de iniciar un servicio de Windows a través de mi aplicación C #. Cuando hago clic en mi botón de inicio, parece que todo funciona, pero cuando inicio sesión en el servidor, el servicio aún no muestra que se está ejecutando. Sin embargo, la segunda vez que lo ejecuto, recibo una excepción que dice que la instancia del servicio ya se está ejecutando. De nuevo, cuando inicio sesión en el servidor, el servicio parece estar detenido. ¿Alguien ha visto esto alguna vez?

Aquí está mi código.

try { while (reader.Read()) { int timeoutMilliseconds = 1000; string serviceName = reader["ServiceName"].ToString(); string permission = reader["Permission"].ToString(); if (permission == "E") { lblServStartSuccess.Visible = true; ServiceController service = new ServiceController(serviceName); TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } else { lblServErrorStart.Visible = true; } } } catch (Exception ex) { Response.Write(ex.ToString()); }

EDITAR: Esta es la excepción que recibí en un servicio:

System.InvalidOperationException: Service Logical Disk Manager El servicio administrativo no se encontró en la computadora ''.''. ---> System.ComponentModel.Win32Exception: el servicio especificado no existe como un servicio instalado --- Fin del seguimiento de la pila de excepción interna

Sé que el servicio existe. ¿Debo agregar algo en frente del servicio para decirle qué servidor mirar?


En primer lugar, debe agregar la referencia de la DLL (ServiceProcess) en las referencias de su proyecto como:

Right click on References in Solution Explorer -> Add Reference -> Assemblies -> Framework -> System.ServiceProcess

A continuación, agregue la DLL ServiceProcess en su proyecto:

using System.ServiceProcess;

Después de eso usa este código:

ServiceController service = new ServiceController(yourServiceName);


Este es el código que tengo en un Servicio de Ventanas responsable de detener el inicio de otros servicios que se ejecutan en el mismo servidor.

ServiceController controller = new ServiceController(serviceName); if (controller.Status==ServiceControllerStatus.Running) controller.Stop(); if (controller.Status==ServiceControllerStatus.Stopped) controller.Start();


Este es un hilo viejo, pero google me consiguió aquí. Mis servicios, incluso después de iniciar con éxito, seguirían preguntando como detenidos. Si agrega

service.Refresh();

Consultará el estado actual real en lugar del estado almacenado de una consulta previa. No sé por qué funciona así, pero funciona.

PD: Agregué un minuto de larga duración y todavía recibí un servicio. La respuesta se detuvo sin la actualización.


Si el código que mostró se está ejecutando en una máquina diferente de donde se supone que se debe ejecutar el servicio (no estoy seguro de sus comentarios, si ese es el caso o no), deberá proporcionar el nombre de la máquina en el constructor ServiceController. ¿Es posible que esté iniciando con éxito el servicio, pero no en la máquina que cree? Eso encajaría con los síntomas que describes.

ServiceController service = new ServiceController(serviceName, serverName);

http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx


Solo prueba service.Start (); sin timeout o waitforstatus y enganche sus eventos para ver qué está pasando.


public static void StartService(string serviceName, int timeoutMilliseconds) { ServiceController service = new ServiceController(serviceName); try { int millisec1 = 0; TimeSpan timeout; // count the rest of the timeout int millisec2 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1)); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } catch (Exception e) { Trace.WriteLine(e.Message); } } public static void StopService(string serviceName, int timeoutMilliseconds) { ServiceController service = new ServiceController(serviceName); try { int millisec1 = 0; TimeSpan timeout; if (service.Status == ServiceControllerStatus.Running) { millisec1 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); } } catch (Exception e) { Trace.WriteLine(e.Message); } } public static void RestartService(string serviceName, int timeoutMilliseconds) { ServiceController service = new ServiceController(serviceName); try { int millisec1 = 0; TimeSpan timeout; if (service.Status == ServiceControllerStatus.Running) { millisec1 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); } // count the rest of the timeout int millisec2 = Environment.TickCount; timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } catch (Exception e) { Trace.WriteLine(e.Message); } }

No olvide agregar ServiceProcess como referencia usando System.ServiceProcess;