Ответ 1
Вы посмотрели paxScript.NET?
Есть ли готовый к использованию интерпретатор С#, то есть не полагается на компиляцию во время выполнения?
Мои требования:
Если это не ясно, мне нужно что-то вроде Jint (http://jint.codeplex.com/), но который позволяет мне писать скрипты С# вместо JavaScript из них.
Спасибо за вашу помощь.
Вы посмотрели paxScript.NET?
Просмотрите проект Mono. Недавно они продемонстрировали CsharpRepl, который звучит так, как вы. Видео PDC 2008 здесь.
В альтернативной возможности можно включить компилятор Mono С# (источники здесь) в вашем проекте и использовать его для создания сборок, загружаемых из файловой системы. Это вас беспокоит ресурсы, необходимые для загрузки всех этих сборок, которые вы могли бы загрузить в отдельный AppDomain.
LINQPad может работать как ID-код фрагмента кода. Приложение очень маленькое и легкое. Это бесплатно (как в пиве), но не с открытым исходным кодом. Автозаполнение стоит дополнительно, но не намного ($ 19).
Изменить: прочитав комментарии в этом сообщении немного внимательнее, я не думаю, что LINQPad - это то, что вы хотите. Вам нужно что-то, что может программно оценивать тысячи маленьких скриптов динамически, не так ли? Я сделал это на работе с помощью Iron Ruby очень легко. Если вы хотите использовать язык DLR, это, вероятно, будет более осуществимым. Я также сделал некоторую аналогичную работу с некоторым кодом, который мог бы оценивать выражение lambda С#, переданное в виде строки, но это было крайне ограничено.
Мне нужно оценить 10000+ маленьких скрипты, которые все разные, составление всех из них было бы просто значительно медленнее
Интерпретация этих вопросов будет еще более болезненно медленной. У нас есть аналогичная проблема, которую мы адресуем следующим образом:
Мы используем проект Gold Parser для анализа исходного кода и преобразования его в "общий язык" на основе XML. Мы запускаем это через преобразование, которое генерирует исходный код VB.Net(просто потому, что он нечувствителен к регистру). Затем мы компилируем их с использованием среды .NET в автономную DLL и вызываем это с использованием строго ограниченного доступа.
Кажется, что вы создаете нечто вроде динамического веб-сайта, где люди могут создавать пользовательские модули или фрагменты функциональности, но с помощью С# для этого возникает пара основных проблем; С# должен быть скомпилирован, и единственный способ обойти это - использовать его во время выполнения, и это невозможно, и даже если вы выполните компиляцию каждого фрагмента, тогда вы получите 10 000 DLL, что нецелесообразно и непригодно.
Если ваши фрагменты редко меняются, я бы подумал, что они будут программно обертывать их в один набор источников, каждый из которых имеет уникальное имя, а затем компилирует их одним выстрелом (или как временный процесс каждые 10 минут?). Это то, что мы делаем, так как оно также позволяет "управлять версиями" сессий людей, поэтому они продолжают использовать версию DLL, которую они имели в начале своего сеанса, но когда каждый сеанс останавливается, используя старую версию, он удаляется.
Если ваши фрагменты регулярно меняются в течение дня, я предлагаю вам вместо этого интерпретировать язык сценариев, даже PHP, и смешивать свои языки в зависимости от требуемых функций. Такие продукты, как CScript и LinqPad, используют CodeDomProvider, потому что вы должны иметь IMSL где-нибудь, если хотите запрограммировать скомпилированную логику.
Единственный другой вариант - написать собственный интерпретатор и использовать рефлексию для доступа ко всем другим библиотекам, которые вам нужны для доступа, но это чрезвычайно сложно и ужасно.
Поскольку ваши требования действительно недостижимы, я предлагаю вам сделать шаг назад и выяснить способ устранения одного или нескольких ограничений. Независимо от того, находите ли вы среду FullTrust для компиляции своих фрагментов, удалите необходимость в полной поддержке кода (т.е. Перейдите к интерпретации поддержки фрагмента кода) или даже измените всю структуру на что-то не .Net.
Я написал проект с открытым исходным кодом 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.
или http://www.csscript.net/ Олег писал хорошее вступление в проект
Он не обрабатывает точный синтаксис С#, но PowerShell настолько хорошо связан с платформой .NET и является таким зрелым продуктом, я думаю, вам было бы неразумно игнорировать его как по крайней мере возможное решение. Большинство серверных продуктов, выпущенных Microsoft, теперь поддерживают PowerShell для их интерфейса сценариев, включая Microsoft Exchange и Microsoft SQL Server.
Я столкнулся с той же проблемой. В одном проекте я хотел предоставить общий способ определения условий, контролирующих, когда необходимо создать определенное письмо. В другом проекте условия контролировали, как случаи были назначены для очередей. В обоих из них Следующее решение отлично работало:
Все это работает без проблем.
Edit
Просто пояснить "фрагмент". Условия, о которых я говорю, - это просто логические выражения. Я программно добавляю дополнительный текст, чтобы превратить его в методы и методы в компилируемые классы.
Также я могу сделать то же самое с С#, хотя я все еще думаю, что JScript лучше для фрагментов кода
И BTW мой код с открытым исходным кодом не стесняется просматривать. Просто имейте в виду, что существует много кода, не связанного с этим обсуждением. Сообщите мне, если вам нужна помощь, чтобы найти фрагменты, касающиеся темы
bungee # - это то, чего вы хотите, за короткое время, bungee sharp будет проектом с открытым исходным кодом в
. вы можете создавать скрипты с тем же С# syntaxt. при запуске script не создается сборка, интерпретация выполняется "на лету", поэтому производительность высокая. все ключевые слова доступны как С#. Надеюсь, вам это очень понравится.
Это хорошо работает С# repl и интерактивный интерпретатор
Я считаю, что Mono имеет монетный двор, интерпретатор, который они используют перед реализацией JIT для данной платформы. Хотя документы на официальном сайте (например, Runtime) говорят, что это просто промежуточное состояние, прежде чем консолидировать виртуальную виртуальную машину, я уверен это был последний раз, когда я скомпилировал его в Linux. Я не могу сейчас проверить это сейчас, к сожалению, но, возможно, это в том направлении, в котором вы хотите.
Является Snippet Compiler что-то, что вы ищете?