2008-08-20 82 views
15

假設我有兩個用C#編寫的應用程序。第一個是引發名爲「OnEmailSent」的事件的第三方應用程序。在另一個應用程序中監聽事件

第二個是我寫的自定義應用程序,我想以某種方式訂閱「OnEmailSent」甚至是第一個應用程序。

有沒有什麼辦法可以將第二個應用程序附加到第一個應用程序的實例上來偵聽「OnEmailSent」事件?


因此,對於進一步澄清,我的具體情況是,我們已經寫在引發「OnEmailSent」事件C#的自定義第三方應用程序。我們可以看到事件存在使用反射器。

我們想要做的是在此組件發送電子郵件時發生其他一些操作。

我們可以想到的最有效的方法是能夠使用某種形式的IPC,如anders所建議的,並監聽由第三方組件引發的OnEmailSent事件。

因爲組件是用C#編寫的,我們正在編寫另一個C#應用程序,它可以將自己附加到正在執行的進程,並且當它檢測到OnEmailSent事件被引發時它將執行它自己的事件處理代碼。


我可能失去了一些東西,但是從我瞭解的遠程工作原理是,有將需要界定某種契約,客戶端可以訂閱的服務器。

我更想到某人寫了一個獨立的應用程序,例如outlook,這個應用程序暴露了我想從另一個應用程序訂閱的事件。

我想我想到的場景是.net調試器,以及它如何附加到執行程序集以檢查代碼,而它正在運行。

回答

11

爲了讓兩個應用程序(單獨的進程)交換事件,他們必須就這些事件如何傳遞達成一致。有很多不同的方法可以做到這一點,而使用哪種方法可能取決於體系結構和上下文。進程之間的這種信息交換的總稱是Inter-process Communication (IPC)。 IPC有很多標準的做法,最常見的是文件,管道,(網絡)插座,remote procedure calls (RPC)和共享內存。在Windows上,使用window messages也很常見。

我不確定這是如何適用於Windows上的.NET/C#應用程序,但在本機Win32應用程序中,您可以hook on to the message loop of external processes and "spy" on the messages they are sending。如果您的程序在調用期望的函數時生成消息事件,則可以通過這種方法來檢測它。

如果您正在自己實現這兩個應用程序,則可以選擇使用任何您喜歡的IPC方法。網絡套接字和更高層的基於套接字的協議(如HTTP,XML-RPC和SOAP)最近非常流行,因爲它們允許您在不同的物理機器上運行應用程序(假設它們通過網絡連接)。

2

你可以嘗試Managed Spy並進行編程訪問ManagedSpyLib

ManagedSpyLib引入了一個名爲ControlProxy的類 。 ControlProxy是 System.Windows.Forms.Control的另一個進程 的表示。 ControlProxy允許您獲取或設置屬性 ,並且 訂閱事件,就好像您在目標 流程內運行了 一樣。使用ManagedSpyLib進行 自動化測試, 兼容性事件記錄,跨進程 通信或白盒測試。

但是這可能不適用於您,取決於ControlProxy是否可以以某種方式訪問​​您在第三方應用程序之後的事件。

你也可以使用Reflexil

Reflexil允許 IL修改通過使用JB EVAIN寫的強大 Mono.Cecil能庫。 Reflexil作爲Reflector插件運行,特別針對IL代碼 進行處理。它通過 完成這個提議完成指令 編輯並允許C#/ VB.NET代碼 注入。

0

該第三方應用程序的OnEmailSent事件的性質是什麼?我的意思是,你怎麼知道應用程序正在觸發這樣的事件?

如果計劃進行進程間通信,你應該問自己的第一個問題是:是否真的有必要?

不問您的動機,如果您確實需要進行進程間通信,則需要某種機制。名單很長很長。從簡單的WM_DATA消息到自定義TCP協議,到需要額外基礎架構的非常複雜的Web服務。

這帶來了一個問題,你準備做什麼?什麼是您無法控制的第三方應用程序?

此外,調試器具有非常侵入性的調試過程。不要期望成爲所有其他應用程序使用的標準進程間機制。事實上,事實並非如此。