我正在编写某种计算服务器场,中央服务器提供计算它们的任务和节点。
我想以这种方式编写它,节点不知道它们究竟在计算什么。它们(从服务器)获得一个实现IComputable iterface的对象,有一个方法,.compute()返回IResult类型对象并将其发送到服务器。
服务器负责准备这些对象并通过wcf服务上的.getWork()方法为它们提供服务,并使用.submitResult(IResult result)方法获取结果。
问题是,工作节点不仅需要知道接口,还需要知道完整的对象实现。 我知道Java可以通过RMI序列化方法(可能是字节码)。是否可以用c#?
答案 0 :(得分:2)
您需要做的是将实现您描述的方法的类型放入单独的程序集中。然后,您可以将程序集作为字节数组发送到服务器,在那里它将加载程序集,为适合您的界面的类型启发它,然后加载它们。这是使用.Net的插件的基本模式。
但是必须要小心。如果您接受来自任意源的代码,则必须锁定这些加载的程序集可以执行的操作(即使您信任源也是最好的做法)。
如何执行此操作的一个很好的经典示例是Terrarium项目。微软制作的案例研究涉及以安全的方式传播任意组件的病毒。
答案 1 :(得分:-1)
你可以做到
System.Expression.LambdaExpression<Func<result>> lambda = MyFunction;
然后您可以将表达式序列化为字符串并在服务器上反序列化