双向跨进程通信

本文关键字:通信 进程 | 更新日期: 2023-09-27 18:10:16

我正在做一个项目,我想有一个像系统一样的插件沙箱,但是我有问题制定双向实时跨进程通信。起初我想到了WCF,因为它可以传递对象元数据,但很快意识到WCF的服务客户端模型会带来一个问题。但在我提出我所有的想法和问题之前,我先说说我的计划。

我想有一个主机应用程序,将做大部分的工作,让我们叫它host.exe, host.exe将托管程序的主要应用程序逻辑,以及启动,执行和杀死插件。插件将通过插件代理托管,插件代理将通过MEF托管插件,因此我们将其称为Proxy .exe。proxy.exe将加载插件dll并将其托管在一个隔离故障的环境中,如果插件失败,它将杀死代理而不是应用程序。主机和代理需要在两个方向上实时通信,因为将有多个代理主机,所以最好能够传递对象数据。

这就是我想要的基本概念。我在想几个办法。第一个是WCF,但是我认为WCF的工作方式对于服务的服务器来说,如果不是不可能的话,向客户端发送请求/命令是很困难的。下一个想法是使用TCP,让主机成为TCP服务器,并开发一个我可以用来通信的消息传递协议,但是这带来了一个问题,因为我没有WCF元数据的奢侈,传递复杂的类信息将是完全疯狂的。

通过我所有的研究,我已经提出了一个又一个问题,如果有人能提出解决这个问题的建议,我将不胜感激。谢谢你!

双向跨进程通信

我的解决方案可能是远程。我不知道WCF是否以同样的方式做这件事。但是可以用文本配置远程,并且可以设置服务器以随意远程到对象。

我想事先警告你。我提到的项目是相当一段时间以前的,所以这可能是过时的信息(WCF可能做同样的事情,也可能不是,我的公司没有要求我做任何WCF工作。)

我将我的对象从客户端远程到服务器。我将运行服务器(实际上在单独的机器上),然后使用tcp远程,我想要的所有对象都将被声明到该应用程序中。

现在是有趣的部分。该远程对象使用了非远程委托对象。我将初始化对象(远程),然后服务器将创建它。然后,我将初始化另一个(接口类型)本地对象,并将其附加到远程对象。

当远程对象想要与我通信时,它会向我发送可序列化的信息,我可以将其构造成更多的对象或命令。无论需要什么……(可能是更远程的对象)

无论如何。一个服务器和多个远程对象将与CommonInterface.dll一起来回发送,其中包含其中定义的所有标准接口对象。

对于所有的意图和目的,这是一个盲目的插件设置,任何想要从我的服务器获取信息的应用程序都可以实现和处理它们的类,只要接口匹配。(使用可序列化的命令数据)

如果插件(客户端)崩溃,那么应用程序(服务器)将不会受到影响。它只是将所有与该插件的通信包装在一个try catch中,并且远程对象将具有某种存活时间或ping风格的释放机制。

我真的不知道你的场景会像沙箱一样,但这可能会完成你所要求的。

这是一个。net远程聊天服务器。http://www.codeproject.com/KB/IP/dotnetchatapplication.aspx

这是我第一次使用远程控制构建的相同类型的项目。我把它演变成我的服务器插件架构。我的使用和你的不同之处在于服务器是我的客户端是使用服务器的主要应用程序,而你的服务器将是允许多个客户端插件的主要应用程序。

在我看来,我建议您使用不同的应用程序域,使用接口与插件通信,并使用真正的代理对象引用。不要使用不同的进程,可以通过应用程序域隔离实现插件隔离,因为除非指定,否则异常不会跨应用程序域边界。

作为一种替代方法,您可以使用过时的技术,如。net Remoting,用于自定义封送和透明代理对象创建。

在我看来,WCF太重了,离实时处理太远了

进程间通信。这也许应该被称为跨进程通信(CPC)是一个已知的MS/Windows特定概念。

更多信息在这里

在过去,我使用RPC和Windows管道(它也用于SQL server传输大型数据集/结果)

你可以尝试另一种通信方式,WCF, Sockets, Pub/Sub Messaging;例如,TibcoRv(它在本地会绕过套接字)。我觉得这些有点过头了。但可以完美地满足您的需求