c# - 2路跨进程通信

标签 c# wcf mef cross-process dynamic-assemblies

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

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

这就是我想要的基本想法。我正在考虑几种方法来做到这一点。第一个是 WCF,但是我认为 WCF 的工作方式即使不是不可能,也很难让服务的服务器向客户端发送请求/命令。下一个想法是什么使用 TCP,让主机成为 TCP 服务器并开发一个我可以用来通信的消息协议(protocol),但是这会带来一个问题,因为我没有 WCF 元数据的奢侈,并且传递复杂的类信息会快疯了。

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

最佳答案

我的解决方案可能是远程处理。我不知道 WCF 是否以同样的方式执行此操作。但是可以使用文本配置远程处理,并且可以将服务器设置为随意远程访问对象。

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

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

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

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

无论如何。一台服务器和多个远程对象将通过 CommonInterface.dll 来回发送,其中定义了所有标准接口(interface)对象。

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

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

我真的不知道您的沙盒场景会是什么样子,但这可能会完成您的要求。

这是一个 .net 远程聊天服务器。

http://www.codeproject.com/KB/IP/dotnetchatapplication.aspx

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

关于c# - 2路跨进程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7642369/

相关文章:

c# - 使用 ReliableSqlConnection 填充数据表

c# - 如何将DbQuery的结果放入ComboBox?

wcf - 如何从MVC4的 Controller 异步调用wcf服务

c# - 在运行时动态合并资源字典(对于插件)

wpf - Prism:创建外壳后将模块加载到目录中

c# - C Sharp 表格不断更新?

c# - 在套接字编程c#中发送大文件

.net - MEF 导出程序集中的自定义配置部分

wcf - 将 NInject 与 WCF 服务一起使用时使用 MSMQ 绑定(bind)在 WAS 中托管时替代 HttpContext

wcf - WsDualHttpBinding 不回调客户端,及时处理问题