2010-02-24 46 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