Pregunta

Nunca antes había tenido que hacer IPC en Windows.Actualmente estoy desarrollando un par de programas, una aplicación GUI/CLI estándar y un servicio de Windows.La aplicación tiene que indicarle al servicio qué hacer.Entonces, suponiendo que la comunicación sea únicamente local, ¿cuál sería el mejor método de comunicación para estos dos procesos?

Donde mejor se define como más robusto y menos propenso a errores, no como el de mayor rendimiento ni el más fácil de codificar.

Los ejemplos de código serán bienvenidos, pero no son obligatorios :-)

Tenga en cuenta que estoy preguntando qué usar, un socket TCP estándar, canalizaciones con nombre o algún otro medio de comunicación únicamente.

¡Gracias!

¿Fue útil?

Solución

IPC en .Net se puede lograr usando:

WCF

usando tuberías con nombre requiere .Net 3.0 y por encima.

Ejemplo de código


remoto

El marco IPC original lanzado con .Net 1.0.Creo que la comunicación remota ya no se está desarrollando activamente y le recomendamos que utilice WCF en su lugar.

Ejemplo de código

Comunicación entre procesos vía Remoting - utiliza un canal tcp

Recursos


Win32 RPC usando csharptest-net RpcLibrary

Recientemente me encontré con un proyecto que empaquetó la biblioteca RPC de Win32 y creó una biblioteca de clases .net que se puede usar para RPC local y remota.

Página de inicio del proyecto: http://csharptest.net/projects/rpclibrary/

Referencias de MSDN:

También tiene un cliente rpc de buffers de protocolo de Google que se ejecuta sobre la biblioteca: https://code.google.com/p/protobuf-csharp-rpc/


WM_COPYDATA

Para completar, también es posible utilizar el método WIN32 con el WM_COPYDATA mensaje.He usado este método antes en .Net 1.1 para crear una aplicación de instancia única que abre varios archivos desde el Explorador de Windows.

Recursos

Enchufes

Usar un protocolo personalizado (más difícil)

Otros consejos

Solo para local, hemos tenido éxito al utilizar Named Pipes.Evita la sobrecarga de TCP y es prácticamente (al menos para .NET) lo más eficiente posible y, al mismo tiempo, tiene una API decente con la que trabajar.

Dado que está limitado a .Net 2.0, WCF quizás no sea una opción.Podría utilizar la comunicación remota .Net con memoria compartida como mecanismo de comunicación subyacente entre dominios de aplicaciones en la misma máquina.Con este enfoque, puede colocar fácilmente sus procesos en diferentes máquinas y reemplazar el protocolo de memoria compartida con un protocolo de red.

El método estándar para comunicarse con un servicio de Windows es utilizar códigos de control de servicio.Los servicios de Windows pueden recibir códigos del 0 al 255.0-127 está reservado para el sistema.Del 128 al 255 se pueden utilizar para comandos personalizados.

Si necesita enviar objetos complejos al servicio, utilice la base de datos, xml, archivo, tcp, http, etc.Aparte de eso, para enviar comandos de control como recargar configuración, elementos de proceso, etc., se deben utilizar estos códigos de control.

Hay funcionalidades adicionales disponibles como consultar el servicio.Consulte la API y la documentación del servicio de Windows.

http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/

Su mejor opción es utilizar WCF.Podrá crear un host de servicio en el servicio de Windows y exponer una interfaz bien definida que la aplicación GUI puede consumir.WCF le permitirá comunicarse a través de canalizaciones con nombre si lo desea, o puede elegir cualquier otro protocolo de comunicación como TCP, HTTP, etc.Al utilizar WCF, obtiene excelente soporte de herramientas y mucha información disponible.

Me gustaría contribuir a esta discusión.Por favor, repréndeme si esto es muy extraño, pero ¿no se podría utilizar un semáforo (o varios semáforos) para una comunicación rudimentaria?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top