C + C#进程间通信:命名管道,内存映射文件还是其他?

时间:2010-01-06 16:09:29

标签: .net c ipc named-pipes memory-mapped-files

我正在玩C dll来挂钩全局Windows事件,下一步是向C#应用程序发送一些事件数据(没什么大的)。

由于我希望此通信尽可能快,我正在分析两个选项:命名管道和内存映射文件。

我知道.NET 4以原生方式带来MMF,但我必须以.NET 2为目标,因为Win98客户端的存在仍然存在。我也知道有办法通过Windows API管理带有.NET 2的MMF(有些人甚至为它构建了一些包装器。)

在这方面,我想知道:

  1. 选择命名管道而不是MMF有什么大的缺点(主要是性能)?重要的是要记住,我不会传输大量数据;
  2. NP或MMF(针对.NET 2)是否涉及任何安全问题?
  3. 有没有比那些更好的选择?

3 个答案:

答案 0 :(得分:2)

如果目标应用程序有一个可以发送消息的窗口,并且您发送的数据量相对较小,请考虑使用WM_COPYDATA消息来传递信息。

此消息是为简单的进程间通信(目标有GUI)而设计的,可以由本机或.NET应用程序使用,几乎没有任何努力,除了你的压力之外,对系统没有任何影响通过创建传递的数据来放置内存,并且可以在Windows 95的所有Windows系统上使用。

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

答案 1 :(得分:1)

选项1:在您的一个C#对象上公开COM接口,并从C ++应用程序中调用它。

选项2:使用C ++ / CLI - 您可以使用Win32 API挂钩全局Windows事件,并在另一端公开.Net类,以便C#客户端直接使用。

当然,这两个选项都没有回答你关于命名管道与内存映射文件的问题,但我认为除非你特别需要将这些文件作为单独的进程保存,否则这些选项中的任何一个都会更简单。

答案 2 :(得分:0)

无法告诉MMF,因为我没有尝试过使用它,但从外观上看,它看起来有点过于复杂而无法设置。在包装P / invokes之后,为了能够将命名管道公开为一个带有.NET 2.0的流(我创建了相似的3.5 System.Core类),很容易以任何方式发送数据包如果您可以设置权限,以使Vista / 7更具限制性策略。

可能你最好在C#应用程序中拥有服务器流,并在本机代码中使用你可能的无数客户端实例(我不确定你是否可以在挂钩之前共享一个实例)使用你注入dll的所有进程,所以我认为你将拥有多个客户端。)

我已经完全放弃了针对Vista / 7的DLL挂钩。