2011-10-04 98 views
2

我正在开发一个项目,我想要一个像系统一样的插件沙箱,但是我遇到的问题是双向实时交叉进程通信。起初我想到了WCF,因为它可以传递对象元数据,但是很快就意识到WCF的Service Client模型会带来问题。但在我放下所有的想法和问题之前,这正是我的计划。双向交叉进程通信

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

所以这是我想要的基本想法。我在想几种方法来做到这一点。第一个是WCF,但是我认为WCF的工作方式对于服务器的服务器发送请求/命令将是困难的。下一个想法是什么使用TCP,并让主机成为一个TCP服务器并开发一个可用于通信的消息传递协议,然而这带来了一个问题,因为我没有WCF元数据的奢华和传递复杂的类信息精神错乱。

通过我所有的研究,我已经提出了问题后的问题,它将非常感谢,如果有人能够建议解决这个问题。谢谢。

+0

你如何帮助我们?你真的认为使用几个代码示例我们可以解决你的问题吗? –

+0

你在说IPC吗?那么,你不需要WCF,WCF不是实时的进程间通信服务,而是使用基于IPC的实时客户端 - 服务器技术。 –

+0

@Artur Mustafin,我只是想要我的计划到目前为止的想法和反馈。是的,我知道WCF不是实时的。这是我正在看的一个选项。虽然我没有代码,但我不想要代码,只是想法和反馈,谢谢。 – p1p3l1n3

回答

0

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

我想提前警告你。我提到的这个项目是在不久之前发布的,所以这可能是过时的信息(WCF可能做同样的事情或不可能,我的公司不需要我的任何WCF工作。)

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

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

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

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

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

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

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

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

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

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

+1

远程处理已弃用WCF。 –

+0

谢谢你和我在想的一样,它看起来像是有效的。我只需要设法将信息序列化成我可以处理它的方式,然后即时设置,非常感谢! – p1p3l1n3

0

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

作为替代方案,您可以将不推荐的技术用作.NET Remoting,用于创建编组和透明代理对象创建。

在我看来,WCF是太重和实时处理

+0

是的,我看着AppDomains,但加载和卸载似乎是更麻烦,然后它是值得的,从我读的应用程序的参考从未真正收集。所以如果我在哪里编译一个新的对象来加载和卸载旧的,它永远不会真正被卸载。 – p1p3l1n3

+0

当插件在其创建的线程中发生异常时,其应用程序域崩溃,并且.NET在任何应用程序域崩溃时终止整个过程。这样主持人也被杀害了。需要进程隔离来防止来自插件的未处理的侧线程异常。 –

0

进程间通信(IPC)太远。其中可能应该称为跨进程通信(CPC)是已知的MS/Windows特定概念。

更多关于它here

在过去,我已经使用RPC和Windows管道(也适用于SQL服务器传输大型数据集/结果)

你总是可以尝试其他方法沟通,WCF,套接字,酒吧/消息传递;例如,TibcoRv(本地将绕过套接字)。 我觉得这些有点矫枉过正。但可以完美满足您的要求。