динамическая оценка кода C#, Eval, REPL

Кто-нибудь знает, есть ли способ оценить код С# во время выполнения. например. Я хотел бы разрешить пользователю вводить DateTime.Now.AddDays(1) или что-то подобное в виде строки, а затем оценивать строку, чтобы получить результат.

Меня интересует, можно ли получить доступ к функциям emmediate Windows, поскольку кажется, что каждая введенная строка динамически оценивается.

Я обнаружил, что в VB есть недокументированная функция API EbExecuteLine() из VBA*.dll, и мне интересно, есть ли что-то эквивалентное для С#.

Я также нашел специальный инструмент https://github.com/DavidWynne/CSharpEval (раньше он был на kamimucode.com, но автор переместил его на GitHub), кажется, это работает, но я бы предпочел что-то, что входит в состав .NET.

Спасибо


person ricardo    schedule 05.04.2011    source источник
comment
Связанный вопрос... stackoverflow.com/questions/1660452/   -  person Christopher McAtackney    schedule 05.04.2011


Ответы (5)


Mono имеет интерактивную командную строку (csharp.exe)

Вы можете посмотреть его исходный код, чтобы увидеть, как именно он делает это волшебство:

https://github.com/mono/mono/raw/master/mcs/tools/csharp/repl.cs

person sehe    schedule 05.04.2011

Как вы, наверное, уже заметили, встроенного метода для оценки кода C# во время выполнения не существует. Это основная причина существования пользовательского инструмента, о котором вы упомянули.

У меня также есть программа оценки C#, которая позволяет оценивать код C#. Он обеспечивает оценку кода C# во время выполнения и поддерживает множество операторов C#. На самом деле этот код можно использовать в любом проекте .NET, однако он ограничен использованием синтаксиса C#. Дополнительную информацию см. на моем веб-сайте http://csharp-eval.com.

person xnaterm    schedule 10.06.2011

Компилятор C# от Microsoft еще не имеет компилятора как услуги (должен поставляться с C# 5.0).

Вы можете использовать REPL Mono или написать свой собственный сервис, используя CodeDOM

person Claus Jørgensen    schedule 05.04.2011

Это не быстро, но вы можете скомпилировать код на лету, см. мой предыдущий вопрос,

Когда у вас есть сборка и вы знаете имя типа, вы можете создать экземпляр вашего скомпилированного класса, используя отражение, и выполнить свой метод.

person Richard Friend    schedule 05.04.2011

среда сценариев C# REPL платформы O2 использует Fluent# API с действительно мощным API отражения, позволяющим выполнять фрагменты кода.

Например:

"return DateTime.Now.ToLongTimeString();".executeCodeSnippet(); 

вернусь

5:01:22 AM

обратите внимание, что "...".executeCodeSnippet(); фактически может выполнить любой допустимый фрагмент кода C# (поэтому он достаточно мощный).

Если вы хотите контролировать, что могут выполнять ваши пользователи, я мог бы использовать деревья AST, чтобы ограничить функции C#, к которым у них есть доступ.

Также взгляните на Roslyn от Microsoft, который ОЧЕНЬ мощный, как вы можете видеть на Несколько инструментов на основе Roslyn (все работают автономно вне VisualStudio)

person Dinis Cruz    schedule 03.08.2012