我正在玩C dll来挂钩全局Windows事件,下一步是向C#应用程序发送一些事件数据(没什么大的)。
由于我希望此通信尽可能快,我正在分析两个选项:命名管道和内存映射文件。
我知道.NET 4以原生方式带来MMF,但我必须以.NET 2为目标,因为Win98客户端的存在仍然存在。我也知道有办法通过Windows API管理带有.NET 2的MMF(有些人甚至为它构建了一些包装器。)
在这方面,我想知道:
答案 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挂钩。