Код удаленного выполнения - лямбда-выражения ... статические методы .... и т. eval () для C #? - PullRequest
2 голосов
/ 15 января 2010

Итак, вот концепция. Я пытаюсь написать C # для CouchDB (продолжайте читать, это не имеет ничего общего с CouchDB).

Вот основная идея:

1) Драйвер БД загружает произвольную строку на сервер БД.

2) Драйвер БД говорит серверу БД запустить код и создать представление

3) Сервер БД загружает мой бэкэнд C #, передает ему строку ввода

4) Сервер БД передает эту функцию бэкенду C #

5) Сервер БД передает данные бэкэнда C # для выполнения функции над

6) Сервер C # выполняет код и передает данные на сервер БД.

7) Сервер БД сохраняет или сортирует иным образом и отправляет результаты обратно в Драйвер БД

Итак, у меня проблема с удаленным выполнением кода. Все мои модели являются объектами C #. Так что было бы очень приятно иметь возможность писать код на внешнем интерфейсе и передавать код на сервер для выполнения. Без необходимости копировать библиотеки DLL и т. Д. В настоящее время в CouchDB этот язык запросов является JavaScript, поэтому просто скопировать код в строку очень просто.

Есть ли такие варианты в C #? Могу ли я получить строковую версию функции? Должен ли я создать внешний сервер, который размещает эти сборки DLL и обслуживает их до бэкэндов CouchDB? Должен ли я скомпилировать их во внешнем интерфейсе и встроить файлы .cs в качестве ресурса? Я просто мозговой штурм в этой точке. Любые мысли / идеи / вопросы приветствуются.

Ответы [ 4 ]

0 голосов
/ 21 января 2010

Сможете ли вы достичь этого, используя деревья выражений (System.Linq.Expressions)?

Возможно, какое-то средство передачи сериализованного дерева выражений на сервер, компиляции его в лямбду / Func <> на стороне сервера и последующего его выполнения?

Не играл с ними, за исключением некоторых исследований любопытства, когда Линк был представлен, но это может помочь.

0 голосов
/ 15 января 2010

Определить «функцию». Это произвольный код (который должен динамически компилироваться и выполняться) или список методов, которые могут быть присоединены к классу?

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

Веб-службы и службы WCF являются отличным способом распределения обработки между компьютерами.

0 голосов
/ 15 января 2010

В прошлом я использовал несколько проектов, которые могут вам помочь:

Vici Parser

Vici Parser - это библиотека .NET для поздний анализ разбора выражения и Рендеринг шаблонов. Это также включает простой в использовании токенизатор, который может быть используется для разбора всех видов файлов форматы (полнофункциональный анализатор JSON включен).

Этот код проекта статьи

В этом примере показана функция "Eval" для C # и реализует различные использования этой функции оценки. Библиотека написано на C # и может быть проверено с MainForm в решении.

Другие альтернативы включают в себя использование сценариев XSLT (что-то Umbraco CMS использует ) и, возможно, что-то вроде LUA.NET , что позволит вам выполнить песочницу, что может делать код.

0 голосов
/ 15 января 2010

Похоже, что вы ищете, это метод оценки в стиле Javascript для C #. К сожалению, это не существует сегодня и не является тривиальным для реализации. Два основных подхода для динамического выполнения кода на C #:

  1. Создание легких методов с помощью Reflection.Emit
  2. Компиляция сборок на лету (через CodeDom или прямые звонки в csc).

Еще один вариант, который следует рассмотреть здесь, - воспользоваться динамическим языком. Начиная с C # 4.0, очень легко взаимодействовать с динамическими языками. Вместо того, чтобы на сервер передавался код C #, почему бы не передать Python или Ruby и не использовать преимущества DLR?

...