Domanda

Supponiamo di avere due applicazioni scritte in C#.La prima è un'applicazione di terze parti che genera un evento chiamato "OnEmailSent".

La seconda è un'app personalizzata che ho scritto e che vorrei in qualche modo iscrivere a "OnEmailSent" anche della prima applicazione.

Esiste un modo per allegare in qualche modo la seconda applicazione a un'istanza della prima applicazione per ascoltare l'evento "OnEmailSent"?


Quindi, per ulteriori chiarimenti, il mio scenario specifico è che abbiamo un'applicazione personalizzata di terze parti scritta in C# che genera un evento "OnEmailSent".Possiamo vedere che l'evento esiste utilizzando il riflettore.

Ciò che vogliamo fare è che vengano eseguite altre azioni quando questo componente invia un'e-mail.

Il modo più efficiente a cui possiamo pensare sarebbe quello di poter utilizzare una qualche forma di IPC come suggerito da Anders e ascoltare l'evento OnEmailSent generato dal componente di terze parti.

Poiché il componente è scritto in C#, stiamo giocando con l'idea di scrivere un'altra applicazione C# che possa collegarsi al processo di esecuzione e quando rileva che è stato generato l'evento OnEmailSent, eseguirà il proprio codice di gestione degli eventi.


Potrei perdermi qualcosa, ma da quello che ho capito di come funziona la comunicazione remota è che dovrebbe esserci un server che definisca una sorta di contratto a cui il cliente può abbonarsi.

Stavo più pensando a uno scenario in cui qualcuno ha scritto un'applicazione autonoma come Outlook, ad esempio, che espone eventi a cui vorrei iscrivermi da un'altra applicazione.

Immagino che lo scenario a cui sto pensando sia il debugger .net e il modo in cui può collegarsi agli assembly in esecuzione per ispezionare il codice mentre è in esecuzione.

È stato utile?

Soluzione

Affinché due applicazioni (processi separati) possano scambiarsi eventi, devono concordare come questi eventi vengono comunicati.Esistono molti modi diversi per farlo e il metodo esatto da utilizzare può dipendere dall'architettura e dal contesto.Il termine generale per questo tipo di scambio di informazioni tra processi è Comunicazione tra processi (IPC).Esistono molti modi standard per eseguire IPC, i più comuni sono file, pipe, socket (di rete), chiamate di procedura remota (RPC) e memoria condivisa.Su Windows è anche comune da usare messaggi della finestra.

Non sono sicuro di come funzioni per le applicazioni .NET/C# su Windows, ma nelle applicazioni Win32 native è possibile agganciarsi al ciclo di messaggi dei processi esterni e "spiare" i messaggi che stanno inviando.Se il tuo programma genera un evento messaggio quando viene richiamata la funzione desiderata, questo potrebbe essere un modo per rilevarlo.

Se stai implementando entrambe le applicazioni da solo, puoi scegliere di utilizzare qualsiasi metodo IPC che preferisci.I socket di rete e i protocolli basati su socket di livello superiore come HTTP, XML-RPC e SOAP sono molto popolari al giorno d'oggi, poiché consentono di eseguire le applicazioni anche su diverse macchine fisiche (dato che sono connesse tramite una rete).

Altri suggerimenti

Puoi provare Spia gestita e per l'accesso programmatico ManagedSpyLib

ManagedSpiLib introduce una classe chiamata ControlProxy.Unaproxy Control è una rappresentazione di un System.windows.Forms.Control in un altro processo.ControlProxy consente di ottenere o impostare proprietà e iscriverti agli eventi come se stessi eseguendo all'interno del processo di destinazione.Utilizzare ManagedSpiLib per i test di automazione, la registrazione degli eventi per compatibilità, comunicazione incrociata o test Whitebox.

Ma questo potrebbe non funzionare per te, dipende se ControlProxy può in qualche modo accedere all'evento che stai cercando all'interno della tua applicazione di terze parti.

Potresti anche usare Reflexil

Il riflesso consente le modifiche di IL utilizzando la potente libreria mono.cecil scritta da JB Evain.Il riflesso funziona come plug-in del riflettore ed è diretto in particolare verso la gestione del codice IL.Lo realizza proponendo un editor di istruzioni completo e consentendo l'iniezione di codice C#/VB.NET.

È possibile utilizzare la comunicazione remota o WCF.Vedere http://msdn.microsoft.com/en-us/library/aa730857(VS.80).aspx#netremotewcf_topic7.

Qual è la natura dell'evento OnEmailSent da quell'applicazione di terze parti?Voglio dire, come fai a sapere che l'applicazione sta attivando un evento del genere?

Se Voi stai pianificando di effettuare una comunicazione tra processi, la prima domanda che dovresti porti è:È davvero necessario?

Senza mettere in discussione le tue motivazioni, se hai davvero bisogno di fare comunicazione tra processi, avrai bisogno di una sorta di meccanismo.L'elenco è lungo, molto lungo.Dai semplici messaggi WM_DATA ai protocolli TCP personalizzati fino ai servizi Web molto complessi che richiedono infrastrutture aggiuntive.

Ciò porta alla domanda: cosa stai cercando di fare esattamente?Cos'è questa applicazione di terze parti su cui non hai alcun controllo?

Inoltre, il debugger ha un modo molto invasivo di eseguire il debug dei processi.Non aspettarti che questo sia il meccanismo di interprocesso standard utilizzato da tutte le altre applicazioni.In realtà non lo è.

È possibile implementare uno scenario simile con le notifiche di modifica delle query di SQL Server 2005 mantenendo una SqlConnection persistente con un'applicazione .NET che si blocca finché i dati non vengono modificati nel database.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top