Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ривет Хабр!
- Думаю не многие знают, что в C# есть штука на подобии eval из других языков. Благодаря Rosyln API, можно во время выполнения скомпилировать и выполнить C# код. Пример использования можете посмотреть в моей реализации REPL-а для C#.
- Для начала, нужно поставить нугет пакет Microsoft.CodeAnalysis.CSharp.Scripting и сделать using
- CSharpScript - статичный класс, который поможет нам создать скрипт. В нем есть 3 метода:
- * Create - создает Script с указанным кодом и параметрами, который можно будет в последствии скомпилировать и запустить
- * RunAsync - который компилирует, выполняет переданный код и возвращает ScriptState
- * EvaluateAsync - выполняет код и возвращает результат выполнения
- CSharpScript.Create можно использовать, когда вам нужно предварительно скомпилировать скрипт, и часто вызывать его.
- var script = await CSharpScript.Create("System.Console.WriteLine(\"Hello from script\")").RunAsync();
- Eсли не вызвать Compile(), то код будет скомпилирован при первом вызове RunAsync(). Для удобства, можно создать ScriptOptions, в котором можно будет добавить namespace-ы а так же reference-ы (можно так же добавить статические классы, на подобии using static)
- CSharpScript.RunAsync возвращает ScriptState, который можно продолжить вызвав у него ContinueWithAsync, который скомпилирует, выполнит код и вернет новый объект ScriptState, так же можно повторно запустить скрипт обратившись к свойству Script, который хранит текущий объект Script для состояния. Для получения результата, есть свойство ReturnValue.
- ScriptState state = await CSharpScript.RunAsync("int x = 0");
- У объекта state можно посмотреть объявленные переменные, а так же полученный Exception
- С помощью CSharpScript.Create можно создать делегат из скрипта, который будет запускать скрипт при вызове
- А так же, можно скомпилировать лямбда-выражение в виде строки, используя CSharpScript.EvaluateAsync
- var deleg = await CSharpScript.EvaluateAsync<Func<int, int>>("x => x * 2"); Console.WriteLine(deleg(5)); // 10
- Дополнительные примеры можно найти по ссылкам внизу
- https://github.com/dotnet/roslyn/blob/main/docs/wiki/Scripting-API-Samples.md
- https://github.com/dotnet/roslyn/tree/a7319e2bc8cac34c34527031e6204d383d29d4ab/src/Scripting
Advertisement
Add Comment
Please, Sign In to add comment