2010-01-06 70 views
4

我正在玩C dlls來鉤住全局Windows事件,下一步是向C#應用程序發送一些事件數據(沒有任何巨大的數據)。C + C#進程間通信:命名管道,內存映射文件或其他?

,因爲我想這個通信儘可能地快,我分析兩種選擇:命名管道和內存映射文件。

我知道,.NET 4本機方式帶來的MMF,但我必須面向.NET 2,如Win98下的客戶端的存在仍然是可能的。我也知道有很多方法可以通過Windows API管理MMF和.NET 2(有些人甚至已經構建了一些包裝器)。

在這種情況下,我想知道:

  1. 在選擇命名管道,而不是MMF是否有任何大的缺點(主要性能)?重要的是要記住,我不會傳輸大量的數據;
  2. NP或MMF(針對.NET 2)是否存在任何安全問題?
  3. 有沒有比這些更好的選擇?
+0

這並不重要,但Win98 EOL是2006年7月11日。我很遺憾聽到仍然有人堅持使用它。我不羨慕你菲利普... –

+0

更多關於主題,你可以在.NET 2中使用帶有P/Invoke的MMF。 –

+0

在這種情況下,我不能使用P/Invoke,因爲全局掛鉤會附加到每個流程執行,所以程序必須用本地語言(C,Delphi,VB等)編寫。 是的,Martinho,這個Win98的依賴真的很臭。如果你很傷心,想象我們的團隊.. :) – jfneis

回答

1

選項1:在您的一個C#對象上公開一個COM接口,並從您的C++應用程序中調用該接口。

選項2:使用C++/CLI - 您可以使用Win32 API掛鉤全球的窗口的事件和暴露在另一側的.NET類對C#客戶端直接使用。

當然,沒有這些選項回答的命名管道與內存映射文件你的問題,但我認爲任何一項都將是簡單的,除非你有特殊需要,以保持它們作爲單獨的進程。

+0

Tarydon,感謝您的答案。在考慮你的選擇之前,重要的是要知道全局鉤子將它的一段代碼(DLL)附加到機器上執行的每個進程,所以它們必須使用本地代碼編寫。 我不知道選項1是否真的有可能,因爲COM依賴項會附加到每個正在執行的進程(也許可能,但不是performatic)。就我所知,選項2是不可能的。由於該代碼將附加到每個進程,我的C#客戶端不會有一個單一的類來處理(這就是爲什麼我在考慮命名管道)。 – jfneis

2

如果目標應用程序有一個窗口,可以將消息發送到,和要發送的數據量是比較小的,可以考慮使用WM_COPYDATA消息傳遞的信息。

此消息設計用於簡單的進程間通信(目標具有GUI),本地應用程序或.NET應用程序幾乎可以毫不費力地使用此消息,除了任何壓力外,不會對系統產生任何影響你把內存創建你繞過數據,並適用於所有Windows系統從Windows 95

http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx

0

不能告訴MMF雖然我還沒有嘗試使用它,但從它的外觀來看,它似乎有點太複雜,無法設置的東西。在封裝了P/invokes之後,爲了能夠以.NET 2.0的形式公開命名管道(我已經創建了3.5 System.Core類的外觀),可以很容易地發送數據包如果您可以設置權限,以使Vista/7更多限制性策略能夠正常工作。

也許你最好在C#應用程序中使用服務器流,並且讓你的本地代碼中的客戶端可能有很多實例可以挑起來(我不確定你能夠共享一個單獨的實例,與所有注入DLL的進程掛鉤,所以我認爲你將有多個客戶端)。

我已經放棄了DLL掛鉤爲Vista/7共爲這一問題。