C# .NET IPC没有服务中介

C# .NET IPC没有服务中介,c#,.net,windows,remoting,ipc,C#,.net,Windows,Remoting,Ipc,我有两个不相关的进程,它们使用.NET程序集作为插件。但是,任何一个进程都可以随时启动/停止。我不能依赖一个特定的进程作为服务器。事实上,其中一个进程可能有多个副本在运行,但另一个进程只有一个副本在运行 我最初实现了一个基于的解决方案。但是,这要求实现服务器的服务器在客户端之前运行 当客户端首先运行时,向服务器执行某种通知的最佳方式是什么?为什么不在两侧托管服务器和客户端,谁先来就成为服务器?如果服务器退出,仍处于活动状态的客户端将切换角色。处理IPC(.net或非)的方法有很多,通过TCP/H

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

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


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

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

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


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

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

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

我对WCF了解不多,但这也可能值得研究。蜘蛛感应说,它可能有一个更优雅的解决方案来解决这个问题。。。也许吧

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

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

我同意Garo的观点

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

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


-Scott

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

嗯,, 保监会