我该怎么做这些IPC技术?

时间:2009-12-14 22:40:54

标签: .net ipc shared-memory windows-messages dynamic-data-exchange

我记得当天使用C和win32时,我有许多IPC技术。到目前为止,我还没有在.NET中碰到任何一个或者在C之外看过它们,所以我想我可以问我如何进行这些进程间通信技术?

  1. 共享/全局内存。只需分配ram,可以在没有任何信号的情况下通过其他过程进行更改。

  2. 窗口消息。我记得使用SendMessage并使用WM_USER + N并告诉另一个应用程序,当我触摸共享内存时,要求它更改文件或设置,有时告诉其他应用程序,我输入一些按键作为宏,因为我有时会感到懒惰。

  3. 动态数据交换。我试过但从来没有让这个工作。从我记得(警告这可能是完全错误的)你注册自己的全局消息或事件和另一个应用程序(通常是你的)将发送消息和两个左右的应用程序可以相互通信,发布消息,你可以有集成两种应用之间的这种方式。我很想知道是什么取代了这个。

  4. 还有我知道仍然使用和看过的命名管道。我记得人们为IPC推荐插座,但我从不喜欢这样做,我知道它仍然存在,如果我需要可以使用。

    我还想念什么以及取代这种技术的是什么?我知道有一个很酷的全局互斥体。我仍然在寻找一种在两个应用程序之间发送消息的现代方式(第2点)。我总是想知道是否存在某种不在管道中的FIFO队列。就像一条Windows消息,除了我可以推送数据(如1k),而不是每次都发送消息和分配全局内存。

    -edit- bump。这个帖子目前仍与我有关。

2 个答案:

答案 0 :(得分:3)

在.NET中,您可以使用:

  1. 命名管道
  2. 内存映射文件
  3. WCF
  4. 在.NET中不容易实现共享/全局内存,您必须对Win32调用和引脚管理内存进行互操作以避免被GC移动。

    窗口消息显然只有在您拥有可见或隐藏的窗口时才有效。 .NET应用程序不应使用此技术。

    DDE - 请勿使用。

答案 1 :(得分:1)

即使你知道套接字,但不是很喜欢它,我还记得在某个地方读过,在Windows上通过localhost的套接字确实有一个快捷方式路径,并且可以优化到单个内存副本的级别。然而,对于我的生活,我无法找到我读到的地方,所以也许其他人可以链接到源。

这样做的缺点是我确信你必须有一个活动的网络代码才能建立连接,但是一旦建立它就不会真正使用整个TCP / IP堆栈。

还有Andrei的帖子说明,我测试了内存映射文件(如果内存服务,本机只在.net 4.0中添加),我遇到了一些麻烦。它可能会工作,但没有太多的文档,你仍然需要写出两个应用程序如何同步读取和写入,无论是通知的信号量,还是查看文件中某个位置的紧密循环。

就个人而言,在APP上我正在开发我通过localhost使用套接字,到目前为止还没有遇到任何大规模的性能或安全问题。但它会回到你的设计目标和安全要求。