son - lista de eventos en c#
Escuchar eventos en otra aplicación (5)
¿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 planea 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.
Supongamos que tengo dos aplicaciones escritas en C #. La primera es una aplicación de terceros que genera un evento llamado "OnEmailSent".
La segunda es una aplicación personalizada que he escrito que me gustaría suscribir de alguna manera al "OnEmailSent" incluso de la primera aplicación.
¿Hay alguna forma de que de alguna manera podría adjuntar la segunda aplicación a una instancia de la primera aplicación para escuchar el evento "OnEmailSent"?
Entonces, para mayor aclaración, mi escenario específico es que tenemos una aplicación personalizada de terceros escrita en c # que genera un evento "OnEmailSent". Podemos ver que el evento existe utilizando reflector.
Lo que queremos hacer es tener algunas otras acciones cuando este componente envíe un correo electrónico.
La manera más eficiente que podemos pensar sería poder utilizar alguna forma de IPC, ya que Anders ha sugerido y escuchado el evento OnEmailSent planteado 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 elevado, ejecutará su propio código de gestión de eventos.
Puede que me esté perdiendo algo, pero por lo que entiendo de cómo funciona la comunicación remota es que debería haber un servidor que defina algún tipo de contrato al que el cliente pueda suscribirse.
Estaba pensando más en un escenario en el que 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 conectar a la ejecución de ensamblajes para inspeccionar el código mientras se está ejecutando.
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 la comunicación entre procesos (IPC) . Existen muchas formas estándar de hacer IPC, siendo las más comunes las de archivos, tuberías, (red) sockets, llamadas de procedimiento remoto (RPC) y memoria compartida. En Windows también es común usar mensajes de ventana .
No estoy seguro de cómo funciona esto para las aplicaciones .NET / C # en Windows, pero en las aplicaciones Win32 nativas puede conectar el bucle de mensajes de los procesos externos y "espiar" los mensajes que están enviando . 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 optar por 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).
Puede implementar un escenario similar con las notificaciones de cambio de consulta de SQL Server 2005 manteniendo una SqlConnection persistente con una aplicación .NET que bloquea hasta que los datos cambien en la base de datos.
Ver http://www.code-magazine.com/article.aspx?quickid=0605061 .
Puede usar la comunicación remota o WCF. Consulte http://msdn.microsoft.com/en-us/library/aa730857(VS.80).aspx#netremotewcf_topic7 .
Puede probar Managed Spy y el acceso programático ManagedSpyLib
ManagedSpyLib presenta una clase llamada ControlProxy. Un ControlProxy es una representación de System.Windows.Forms.Control en otro proceso. ControlProxy le permite obtener o establecer propiedades y suscribirse a eventos como si estuviera ejecutando dentro del proceso de destino. Use ManagedSpyLib para las pruebas de automatización, el registro de eventos para la compatibilidad, la comunicación entre procesos o las pruebas de Whitebox.
Pero esto puede no funcionar para usted, depende de si ControlProxy puede de algún modo acceder al evento que está buscando dentro de su aplicación de terceros.
Reflexil permite modificaciones IL mediante el uso de la poderosa biblioteca Mono.Cecil escrita por Jb EVAIN. Reflexil se ejecuta como complemento Reflector y está dirigido especialmente hacia el manejo de código IL. Lo logra al proponer un editor de instrucciones completo y al permitir la inyección de código C # / VB.NET.