2008-08-20 20 views
15

Supongamos que tengo dos aplicaciones escritas en C#. La primera es una aplicación de terceros que genera un evento llamado "OnEmailSent".Escuchar eventos en otra aplicación

La segunda es una aplicación personalizada que he escrito que me gustaría suscribir de algún modo al "OnEmailSent" incluso en la primera aplicación.

¿Hay alguna manera de que podría adjuntar de alguna manera la segunda aplicación a una instancia de la primera aplicación para escuchar el evento "OnEmailSent"?


Así que para cualquier aclaración, mi escenario específico es que tenemos una costumbre aplicación de terceros escrito en C# que provoca un evento "OnEmailSent". Podemos ver que el evento existe utilizando reflector.

Lo que queremos hacer es tener algunas otras acciones que se lleven a cabo cuando este componente envíe un correo electrónico.

La forma más eficiente que podemos pensar sería poder utilizar algún tipo de IPC, ya que Anders ha sugerido y escuchado para el evento OnEmailSent que está siendo iniciado por el componente de terceros.

Como el componente está escrito en C# estamos jugando con la idea de escribir otra aplicación C# que se pueda adjuntar al proceso de ejecución y cuando detecte que el evento OnEmailSent ha sido raise it ejecutará su propio código de manejo de eventos.


puede ser que falte algo, pero por lo que entiendo de cómo funciona la interacción remota es que no tendría que ser un servidor que define una especie de contrato que el cliente puede suscribirse.

Estaba pensando más en un escenario donde alguien ha escrito una aplicación independiente como Outlook, por ejemplo, que expone eventos a los que me gustaría suscribirme desde otra aplicación.

Supongo que el escenario en el que estoy pensando es el depurador .net y cómo se puede asociar a la ejecución de ensamblajes para inspeccionar el código mientras se está ejecutando.

Respuesta

11

Para que dos aplicaciones (procesos separados) intercambien eventos, deben acordar cómo se comunican estos eventos. Hay muchas maneras diferentes de hacer esto, y exactamente qué método usar puede depender de la arquitectura y el contexto. El término general para este tipo de intercambio de información entre procesos es Inter-process Communication (IPC). Existen muchas formas estándar de hacer IPC, siendo las más comunes las de archivos, tuberías, (red) sockets, remote procedure calls (RPC) y memoria compartida. En Windows también es común usar window messages.

No estoy seguro de cómo funciona esto para aplicaciones .NET/C# en Windows, pero en aplicaciones Win32 nativas puede hook on to the message loop of external processes and "spy" on the messages they are sending. Si su programa genera un evento de mensaje cuando se llama a la función deseada, esta podría ser una forma de detectarlo.

Si está implementando ambas aplicaciones usted mismo puede elegir utilizar cualquier método de IPC que prefiera. Los conectores de red y los protocolos basados ​​en sockets de nivel superior como HTTP, XML-RPC y SOAP son muy populares en estos días, ya que le permiten ejecutar las aplicaciones en diferentes máquinas físicas también (dado que están conectadas a través de una red).

2

Usted puede intentar Managed Spy y para el acceso programático ManagedSpyLib

ManagedSpyLib introduce una clase llamada ControlProxy. Un ControlProxy es una representación de un System.Windows.Forms.Control en otro proceso. ControlProxy permite obtener o establecer propiedades y suscribirse a eventos como si fuera ejecutándose dentro del proceso de destino . Use ManagedSpyLib para las pruebas de automatización , registro de eventos para compatibilidad con , proceso de comunicación cruzado, o prueba de whitebox.

Pero esto puede no funcionar para usted, depende de si ControlProxy puede de algún modo acceder al evento que está buscando en su aplicación de terceros.

También es posible usar Reflexil

Reflexil permite modificaciones IL utilizando la poderosa biblioteca Mono.Cecil escrito por Jb EVAIN. Reflexil se ejecuta como complemento de Reflector y está dirigido especialmente hacia el código IL manejo. Lo hace por proponiendo un editor completo de instrucciones y permitiendo la inyección del código C#/VB.NET .

0

¿Cuál es la naturaleza de ese evento OnEmailSent de esa aplicación de terceros? Quiero decir, ¿cómo sabes que la aplicación está desencadenando un evento así?

Si usted está planeando hacer comunicación entre procesos, la primera pregunta que debe hacerse es: ¿Es realmente necesario?

Sin cuestionar sus motivos, si realmente necesita hacer una comunicación entre procesos, necesitará algún tipo de mecanismo. La lista es larga, muy larga. Desde simples mensajes WM_DATA a protocolos TCP personalizados hasta servicios web muy complejos que requieren infraestructuras adicionales.

Esto trae la pregunta, ¿qué es lo que estás tratando de hacer exactamente? ¿De qué es esta aplicación de terceros de la que no tienes control?

Además, el depurador tiene una forma muy invasiva de depuración de procesos. No espere que sea el mecanismo estándar de interproceso utilizado por todas las demás aplicaciones. Como cuestión de hecho, no lo es.

0

Puede implementar un escenario similar con las notificaciones de cambio de consulta SQL Server 2005 manteniendo una SqlConnection persistente con una aplicación .NET que bloquea hasta que los cambios de datos en la base de datos.

Ver http://www.code-magazine.com/article.aspx?quickid=0605061.

Cuestiones relacionadas