2010-02-24 5 views
1

Я пишу какую-то вычислительную ферму с центральным сервером, дающую задачи и узлы, которые их вычисляют.WCF-сериализация методных тел

Я хотел написать его таким образом, что узлы не знают, что именно они вычисляют. Они получают (от сервера) объект, который реализует IComputable iterface, имеет один метод .compute(), который возвращает объект типа IResult и отправляет его на сервер.

Сервер отвечает за подготовку этих объектов и их обслуживание через метод .getWork() службы wcf и получает результаты с помощью метода .submitResult (результат IResult).

Проблема заключается в том, что рабочие узлы должны знать не только интерфейс, но и полную реализацию объекта. Я знаю, что Java может сериализовать метод (возможно, байт-код) через RMI. Возможно ли с помощью C#?

ответ

2

Что вам нужно сделать, это поместить тип, который реализует метод, который вы описываете, в отдельную сборку. Затем вы можете отправить сборку в виде байтового массива на ваш сервер, где она будет загружать сборку, инсталлировать ее для типов, соответствующих вашему интерфейсу, а затем загружать их. Это основной шаблон для плагинов с использованием .Net.

Следует проявлять определенную осторожность. Если вы принимаете код из произвольных источников, вам придется заблокировать то, что могут сделать эти загруженные сборки (и это хорошая практика, даже если вы доверяете источнику).

Хорошим классическим примером того, как это сделать, является проект Terrarium. Это случайное исследование, которое Microsoft разработала, чтобы обеспечить безопасное распространение вирусного распространения произвольных сборок.

+0

Passing библиотеки DLL с произвольным кодом, вероятно, является жизнеспособным решением, но для обеспечения безопасности, которые могут быть сумасшедшим: D – user76035

-1

Вы можете сделать

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

, а затем вы можете сериализовать выражение в строку и десериализации на сервере

+0

Это будет работать только для ограниченного подмножества значений для «MyFunction». Например, он не может использовать захваченные переменные. Они не будут переводиться на текст и обратно, поскольку они существуют в памяти на исходном компьютере. –

+0

Об ограниченном подмножестве - true. Захваченные переменные могут быть оценены с их значениями и отправлены как константы, поэтому var i = 1; ExecuteOnServer (Compute (i)) становится в сериализованной форме "(Call Compute 1)". Кроме того, я принял некоторый тип шаблона Command, а не декомпилировал все функции и опубликовал IL. – user76035

Смежные вопросы