C # динамическая оценка кода, Eval, REPL - PullRequest
0 голосов
/ 05 апреля 2011

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

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

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

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

Спасибо

Ответы [ 5 ]

1 голос
/ 10 июня 2011

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

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

1 голос
/ 05 апреля 2011

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

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

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

0 голосов
/ 03 августа 2012

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

Например,:

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

вернет

5:01:22 AM

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

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

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

0 голосов
/ 05 апреля 2011

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

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

0 голосов
/ 05 апреля 2011

Компилятор Microsoft C # пока не имеет Compiler-as-a-Service (должен поставляться с C # 5.0).

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

...