Подтвердить что ты не робот

С# Interpreter (без компиляции)

Есть ли готовый к использованию интерпретатор С#, то есть не полагается на компиляцию во время выполнения?

Мои требования:

  • Механизм сценариев
  • Должен обрабатывать синтаксис С#
  • Должно работать в средах среднего доверия
  • Нельзя использовать компиляцию во время выполнения (CodeDomProvider...)
  • Open source (или, по крайней мере, бесплатно как для личного, так и для профессионального использования)

Если это не ясно, мне нужно что-то вроде Jint (http://jint.codeplex.com/), но который позволяет мне писать скрипты С# вместо JavaScript из них.

Спасибо за вашу помощь.

4b9b3361

Ответ 2

Просмотрите проект Mono. Недавно они продемонстрировали CsharpRepl, который звучит так, как вы. Видео PDC 2008 здесь.


Update:
По-видимому, использование Mono.CSharp службы для оценки скриптов будет невозможно. В настоящее время он связан со временем выполнения Mono, и они не ожидают, что он будет запущен в среде среднего доверия. См. это обсуждение для получения дополнительной информации.

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

Ответ 3

LINQPad может работать как ID-код фрагмента кода. Приложение очень маленькое и легкое. Это бесплатно (как в пиве), но не с открытым исходным кодом. Автозаполнение стоит дополнительно, но не намного ($ 19).

Изменить: прочитав комментарии в этом сообщении немного внимательнее, я не думаю, что LINQPad - это то, что вы хотите. Вам нужно что-то, что может программно оценивать тысячи маленьких скриптов динамически, не так ли? Я сделал это на работе с помощью Iron Ruby очень легко. Если вы хотите использовать язык DLR, это, вероятно, будет более осуществимым. Я также сделал некоторую аналогичную работу с некоторым кодом, который мог бы оценивать выражение lambda С#, переданное в виде строки, но это было крайне ограничено.

Ответ 4

Мне нужно оценить 10000+ маленьких скрипты, которые все разные, составление всех из них было бы просто значительно медленнее

Интерпретация этих вопросов будет еще более болезненно медленной. У нас есть аналогичная проблема, которую мы адресуем следующим образом:

Мы используем проект Gold Parser для анализа исходного кода и преобразования его в "общий язык" на основе XML. Мы запускаем это через преобразование, которое генерирует исходный код VB.Net(просто потому, что он нечувствителен к регистру). Затем мы компилируем их с использованием среды .NET в автономную DLL и вызываем это с использованием строго ограниченного доступа.

Кажется, что вы создаете нечто вроде динамического веб-сайта, где люди могут создавать пользовательские модули или фрагменты функциональности, но с помощью С# для этого возникает пара основных проблем; С# должен быть скомпилирован, и единственный способ обойти это - использовать его во время выполнения, и это невозможно, и даже если вы выполните компиляцию каждого фрагмента, тогда вы получите 10 000 DLL, что нецелесообразно и непригодно.

Если ваши фрагменты редко меняются, я бы подумал, что они будут программно обертывать их в один набор источников, каждый из которых имеет уникальное имя, а затем компилирует их одним выстрелом (или как временный процесс каждые 10 минут?). Это то, что мы делаем, так как оно также позволяет "управлять версиями" сессий людей, поэтому они продолжают использовать версию DLL, которую они имели в начале своего сеанса, но когда каждый сеанс останавливается, используя старую версию, он удаляется.

Если ваши фрагменты регулярно меняются в течение дня, я предлагаю вам вместо этого интерпретировать язык сценариев, даже PHP, и смешивать свои языки в зависимости от требуемых функций. Такие продукты, как CScript и LinqPad, используют CodeDomProvider, потому что вы должны иметь IMSL где-нибудь, если хотите запрограммировать скомпилированную логику.

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

Поскольку ваши требования действительно недостижимы, я предлагаю вам сделать шаг назад и выяснить способ устранения одного или нескольких ограничений. Независимо от того, находите ли вы среду FullTrust для компиляции своих фрагментов, удалите необходимость в полной поддержке кода (т.е. Перейдите к интерпретации поддержки фрагмента кода) или даже измените всю структуру на что-то не .Net.

Ответ 5

Я написал проект с открытым исходным кодом Dynamic Expresso, который может преобразовывать текстовое выражение, написанное с использованием синтаксиса С#, в делегаты (или дерево выражений), Выражения анализируются и преобразуются в Деревья выражений без использования компиляции или отражения.

Вы можете написать что-то вроде:

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

или

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

Моя работа основана на статье Скотта Гуа http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx.

Ответ 7

Он не обрабатывает точный синтаксис С#, но PowerShell настолько хорошо связан с платформой .NET и является таким зрелым продуктом, я думаю, вам было бы неразумно игнорировать его как по крайней мере возможное решение. Большинство серверных продуктов, выпущенных Microsoft, теперь поддерживают PowerShell для их интерфейса сценариев, включая Microsoft Exchange и Microsoft SQL Server.

Ответ 8

Я столкнулся с той же проблемой. В одном проекте я хотел предоставить общий способ определения условий, контролирующих, когда необходимо создать определенное письмо. В другом проекте условия контролировали, как случаи были назначены для очередей. В обоих из них Следующее решение отлично работало:

  • Язык для фрагментов - я выбрал JScript, чтобы не беспокоиться о типах переменных.
  • Компиляция - да, это требует полного доверия, но вы можете разместить свой код в отдельной сборке и полностью доверять ему. Не забудьте отметить его атрибутом AllowPartiallyTrustedCaller.
  • Число фрагментов кода - я рассматривал каждый фрагмент как метод, а не класс. Таким образом, несколько методов могут быть объединены в одну сборку.
  • Использование диска. Я выполнил всю сборку в памяти, не сохраняя сборку на диске. Это также помогает, если вам нужно перезагрузить его.

Все это работает без проблем.

Edit

Просто пояснить "фрагмент". Условия, о которых я говорю, - это просто логические выражения. Я программно добавляю дополнительный текст, чтобы превратить его в методы и методы в компилируемые классы.

Также я могу сделать то же самое с С#, хотя я все еще думаю, что JScript лучше для фрагментов кода

И BTW мой код с открытым исходным кодом не стесняется просматривать. Просто имейте в виду, что существует много кода, не связанного с этим обсуждением. Сообщите мне, если вам нужна помощь, чтобы найти фрагменты, касающиеся темы

Ответ 9

bungee # - это то, чего вы хотите, за короткое время, bungee sharp будет проектом с открытым исходным кодом в

http://www.crssoft.com/Services/Bungee

. вы можете создавать скрипты с тем же С# syntaxt. при запуске script не создается сборка, интерпретация выполняется "на лету", поэтому производительность высокая. все ключевые слова доступны как С#. Надеюсь, вам это очень понравится.

Ответ 11

Я считаю, что Mono имеет монетный двор, интерпретатор, который они используют перед реализацией JIT для данной платформы. Хотя документы на официальном сайте (например, Runtime) говорят, что это просто промежуточное состояние, прежде чем консолидировать виртуальную виртуальную машину, я уверен это был последний раз, когда я скомпилировал его в Linux. Я не могу сейчас проверить это сейчас, к сожалению, но, возможно, это в том направлении, в котором вы хотите.

Ответ 12

Является Snippet Compiler что-то, что вы ищете?