2010-01-29 17 views
5

tenemos un servicio de Windows en ejecución y también tenemos una aplicación de consola que utilizamos para configurar este servicio, también tenemos la opción de ver si se registra algún registro.Aplicación de consola para comunicarse con un servicio de Windows

La cosa muy fea con esto es que esta comunicación se realiza mediante un archivo de texto, la aplicación de consola escribe en un archivo de texto y el servicio lo lee y viceversa.

¿Qué utilizarías para esta comunicación? TCP/IP no es una opción porque la aplicación de consola se usará solo para el servicio local en ejecución.

Windows API SendMessage debería ser el camino a seguir?

gracias!

Respuesta

6

recomendaría WCF como la primera cosa a tener en cuenta para todas las comunicaciones en las ventanas si se utiliza .NET como su base para este tipo de cosas y su relativamente fácil de usar. Como excluye TCP, le sugiero usar el Named Pipes Binding.

También hay una serie de aplicaciones de comunicación de Windows disponibles para comunicaciones dentro de la máquina. Named Pipes (como se mencionó), MailSlots, Shared Memory (Memory Mapped files) etc.

Mi sugerencia sería utilizar tuberías con nombre ya sea con WCF o de forma nativa.

0

Memoria compartida? Ver here para un artículo sobre Codeproject, aquí hay otro artículo fastipc en el mismo sitio. Hay una entrada de blog que detalla cómo usar un memory mapped file para compartir a través de un contenedor.

Espero que esto ayude, Saludos cordiales, Tom.

1

Corre menos riesgo de interbloqueos si utiliza métodos de bloqueo de mensajes sin bloqueo. PostMessage, o SendNotifyMessage son mejores que SendMessage porque no bloquean a la persona que llama.

Pero dependen del servicio que tenga un identificador de ventana. ¿Lo hace?

También puede utilizar el mensaje WM_COPYDATA, para pasar más que un WParam un IParam. Si usa este mensaje con PostMessage, debe tener cuidado de no liberar la memoria hasta que el receptor haya terminado con ella. Es más seguro usar SendMessage para WM_COPYDATA.

+0

1 - No estoy seguro de lo que el PO está utilizando para su codificación, pero yo he utilizado WM_COPYDATA PostMessage para comunicaciones entre procesos en el pasado. Si la memoria está asignada a la derecha, la configura para que el receptor la desasigne en la recepción de mensajes. Esto lo mantiene asincrónico. – ChrisBD

+0

Tenga en cuenta que el enfoque 'PostMessage' falla en Vista y más tarde en algunas circunstancias debido al aislamiento de la sesión 0, consulte p. Ej. http://blogs.technet.com/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx –

Cuestiones relacionadas