.NET IPC 没有服务中介

Posted

技术标签:

【中文标题】.NET IPC 没有服务中介【英文标题】:.NET IPC without having a service mediator 【发布时间】:2010-09-07 18:20:42 【问题描述】:

我有两个使用 .NET 程序集作为插件的不相关进程。但是,任何一个进程都可以随时启动/停止。我不能依赖特定进程作为服务器。事实上,其中一个进程可能有多个副本在运行,而另一个进程只有一个。

我最初基于this article 实现了一个解决方案。但是,这需要实现服务器的一方在客户端之前运行。

当客户端首先运行时,向服务器发送某种通知的最佳方式是什么?

【问题讨论】:

【参考方案1】:

使用共享内存更加困难,因为您必须管理共享内存缓冲区的大小(或者只是预先分配足够的内存)。您还必须手动管理放入其中的数据结构。但是,一旦您对其进行了测试和工作,由于其简单性,它将更易于使用和测试。

如果您使用远程路由,则可以使用 IpcChannel 而不是 TCP 或 HTTP 通道,使用命名管道进行单个系统通信。 http://msdn.microsoft.com/en-us/library/4b3scst2.aspx。此解决方案的问题在于,您需要提出一个注册表类型的解决方案(在共享内存或其他一些持久存储中),进程可以向其注册端点。这样,当您查找它们时,您可以找到一种方法来查询系统上运行的所有端点,并且您可以找到您要查找的内容。使用远程处理的好处是序列化和方法调用都非常简单。此外,如果您决定移动到网络上的多台机器,您只需拨动开关即可使用网络通道。缺点是,除非您清楚地区分“远程”调用和“本地”调用,否则远程处理可能会令人沮丧。

我对 WCF 了解不多,但这也可能值得研究。 Spider sense 说它可能对这个问题有更优雅的解决方案……也许吧。

或者,您可以创建一个与所有其他进程分开并启动的“服务器”进程(使用系统互斥锁确保不启动多个)作为中间人和注册所有其他进程的中心。

还要研究事件的发布-订阅模型 (Pub/Sub)。当您有一个在事件源可用之前启动的侦听器但您不想等待注册事件时,此技术会有所帮助。 “服务器”进程将处理事件注册表以链接发布者和订阅者。

【讨论】:

【参考方案2】:

为什么不在两边同时托管服务器和客户端,谁先上来就成为服务器?如果服务器退出,仍然处于活动状态的客户端会切换角色。

【讨论】:

【参考方案3】:

有很多方法可以处理 IPC(.net 与否),通过 TCP/HTTP 隧道是一种方法...但可能是一个非常糟糕的选择(取决于环境和环境)。

共享内存和命名管道是两种方式(是的,它们可以在 .Net 中完成)可能是您更好的解决方案。 .Net Framework 中也有 IPC 类……但由于一些 AppDomain 问题,我个人不喜欢它们……

【讨论】:

【参考方案4】:

我同意加罗的观点。

使用发布/订阅服务将是一个很好的解决方案。这显然意味着该服务需要在其他两个服务之前启动并运行。

如果您想跳过发布/订阅,您可以在具有不同端点的两个应用程序中实现该服务。当任一应用程序启动时,它会尝试通过 IPC 代理访问另一个已知对象。如果代理失败,则其他对象未启动。

-斯科特

【讨论】:

【参考方案5】:

我花了 2 天的时间仔细研究 IPC 的所有可用选项,同时寻找一种可靠、简单且快速的方法来实现全双工 IPC。 IPCLibrary,我在 Codeplex.com 上找到的,到目前为止,在我尝试过的所有选项中都能完美运行。全部只有 7 行代码。 :D 如果有人在尝试寻找全双工 IPC 时偶然发现此问题,请为自己节省大量时间并尝试使用此库。获取源代码,编译 data.dll 并按照给出的示例进行操作。

HTH, 圆

【讨论】:

以上是关于.NET IPC 没有服务中介的主要内容,如果未能解决你的问题,请参考以下文章

客户端服务器 Winform IPC 和东西

Android Binder IPC addService:有没有办法再次删除服务?

IPC服务是怎么回事啊

.Net 2.0 Windows 服务进程通信:数据库还是 IPC?

Mono 和 .NET 中的 IPC

原生 C/C++ 和 C# (.NET) 之间最轻量的 IPC 解决方案是啥?