¿Cómo comunicarse con un servicio de Windows?

Quiero crear un servicio de Windows que valide los datos y acceda a ellos desde otra aplicación de Windows, pero soy nuevo en los servicios y no estoy seguro de cómo comenzar.

Entonces, mientras el servicio se está ejecutando, una aplicación de Windows debería conectarse de alguna manera al servicio, enviar algunos datos y obtener una respuesta, verdadera o falsa.

Verifique la etiqueta IPC (comunicaciones entre procesos) en StackOverflow . Hay varias maneras y tecnologías para hacer esto: mensajes de Windows, sockets, MMF y objetos de sincronización, named pipes, mailslots, etc.

Como una de las formas más sencillas para esta tarea en particular, hemos creado nuestro producto CBFS IPC , que viene con el código fuente.

Pude manejar con éxito el (casi) mismo problema que el suyo al hacer lo siguiente:

En su clase: ServiceBase, que representa su clase de servicio, es posible que tenga:

public Class () //constructor, to create your log repository { InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("YOURSource")) { System.Diagnostics.EventLog.CreateEventSource( "YOURSource", "YOURLog"); } eventLog1.Source = "YOURSource"; eventLog1.Log = "YOURLog"; } 

Ahora, implementa:

 protected override void OnStart(string[] args) {...} 

Y

 protected override void OnStop() {...} 

Para manejar llamadas de comandos personalizados:

 protected override void OnCustomCommand(int command) { switch (command) { case 128: eventLog1.WriteEntry("Command " + command + " successfully called."); break; default: break; } } 

Ahora, use esto en la aplicación donde llamará al Servicio de Windows:

Enum para hacer referencia a sus métodos: (recuerde, los métodos personalizados de los Servicios siempre reciben un int32 (de 128 a 255) como parámetros y con Enum usted hace que sea más fácil recordar y controlar sus métodos

 private enum YourMethods { methodX = 128 }; 

Para llamar a un método específico:

 ServiceController sc = new ServiceController("YOURServiceName", Environment.MachineName); ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "YOURServiceName");//this will grant permission to access the Service scp.Assert(); sc.Refresh(); sc.ExecuteCommand((int)YourMethods.methodX); 

Al hacer esto, puedes controlar tu servicio.

Aquí puede verificar cómo crear e instalar un servicio de Windows. Más sobre el método ExecuteCommand.

¡Buena suerte!

Si está utilizando .NET Framework 4, los archivos mapeados en memoria proporcionan una forma bastante fácil de implementar la comunicación entre procesos.

Es bastante simple, y está bien descrito en la documentación, y evita la sobrecarga (en tiempo de ejecución pero también en términos de esfuerzo de desarrollo) de usar WCF u otras interacciones basadas en conexión / remota, o de escribir datos compartidos en una ubicación central y sondeo (base de datos , archivo, etc.).

Vea aquí para una descripción general.

Puede lograr esto muy fácilmente haciendo que el servicio aloje un servicio WCF y se conecte desde su aplicación.

Usamos tuberías con nombre para este propósito. Pero nuestro cliente implementado con C ++. Si su servicio y aplicación se implementan en .Net, puede usar .Net remoto.

Piénselo como propietario de una base de datos remota. Digamos que tiene 1 base de datos pero 10 aplicaciones que requieren diferentes datos de la base de datos y también que no desea abrir todos sus datos a cada una de las aplicaciones. Además, sus aplicaciones serán independientes de su base de datos, su capa de datos solo será implementado en su servicio, sus aplicaciones no mantendrán esa lógica. Puede escribir un servicio y abrir su servicio a otras aplicaciones.

Cómo escribir tu primer servicio de Windows puede ayudarte.

En versiones anteriores de Windows, puede configurar su servicio de Windows para interactuar con el escritorio. Esto le permitió agregar elementos de interfaz de usuario directamente a su servicio que podrían presentarse al usuario. A partir de Windows Vista, los servicios ya no pueden interactuar directamente con los usuarios, es decir, sin interfaces de usuario.

Para hacer esto, lo que desea hacer es escribir su servicio de Windows y una aplicación front-end de Windows. Para proporcionar el puente de comunicación entre los dos, recomiendo usar Windows Communication Foundation (WCF).

Para crear un servicio de Windows C #, puede seguir las instrucciones paso a paso aquí .