2010-02-24 48 views
1

我正在写一些计算场,中央服务器给出了计算它们的任务和节点。WCF方法体的序列化

我想把它写这样的方式,即节点不知道它们究竟是什么计算。他们从(从服务器)获得实现IComputable iterface的对象,有一个方法,.compute()返回IResult类型对象并将其发送到服务器。

服务器负责准备这些对象,并通过.getWork为他们服务的WCF service()方法,并得到与.submitResult(IResult结果)方法的结果。

问题是,工作节点需要知道不仅界面,但充满对象实现。 我知道Java可以通过RMI序列化方法(可能是字节码)。用c#可以吗?

回答

2

你将要做的就是把它实现你所描述成一个单独的程序方法类型。然后,您可以将程序集作为字节数组发送到您的服务器,它将加载程序集,根据您的界面对类型进行检测,然后加载它们。这是使用.Net插件的基本模式。

一定的照顾,虽然有将要采取。如果您接受来自任意源的代码,您将不得不锁定这些加载的程序集可以执行的操作(即使您信任源代码也是很好的做法)。

一个很好的典型例子为如何做到这一点的是Terrarium项目。这是微软制作的一个案例研究,涉及以安全的方式传播任意程序集。

+0

传递的DLL与任意代码就可能是一个可行的解决方案,但要确保的是安全性可以疯狂: D – user76035 2010-02-24 21:36:01

-1

你可以做

System.Expression.LambdaExpression<Func<result>> lambda = MyFunction; 

,然后可以序列表达字符串和反序列化服务器

+0

这只适用于“MyFunction”的有限值的子集。例如,它不能使用任何捕获的变量。由于它们存在于源机器上的内存中,因此这些文件不能被翻译成文本并返回。 – 2010-02-24 20:53:00

+0

关于有限的子集 - true。捕获的变量可以评估为它们的值并发布为常量,所以var i = 1; ExecuteOnServer(Compute(i))成为序列化形式“(Call Compute 1)”。此外,我假设了某种命令模式,而不是反编译所有函数并发布IL。 – user76035 2010-02-24 21:34:12