Guest User

Untitled

a guest
Apr 18th, 2021
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  1. ривет Хабр!
  2.  
  3. Думаю не многие знают, что в C# есть штука на подобии eval из других языков. Благодаря Rosyln API, можно во время выполнения скомпилировать и выполнить C# код. Пример использования можете посмотреть в моей реализации REPL-а для C#.
  4.  
  5. Для начала, нужно поставить нугет пакет Microsoft.CodeAnalysis.CSharp.Scripting и сделать using
  6.  
  7. CSharpScript - статичный класс, который поможет нам создать скрипт. В нем есть 3 метода:
  8.  
  9. * Create - создает Script с указанным кодом и параметрами, который можно будет в последствии скомпилировать и запустить
  10.  
  11. * RunAsync - который компилирует, выполняет переданный код и возвращает ScriptState
  12.  
  13. * EvaluateAsync - выполняет код и возвращает результат выполнения
  14.  
  15. CSharpScript.Create можно использовать, когда вам нужно предварительно скомпилировать скрипт, и часто вызывать его.
  16.  
  17. var script = await CSharpScript.Create("System.Console.WriteLine(\"Hello from script\")").RunAsync();
  18.  
  19. Eсли не вызвать Compile(), то код будет скомпилирован при первом вызове RunAsync(). Для удобства, можно создать ScriptOptions, в котором можно будет добавить namespace-ы а так же reference-ы (можно так же добавить статические классы, на подобии using static)
  20.  
  21. CSharpScript.RunAsync возвращает ScriptState, который можно продолжить вызвав у него ContinueWithAsync, который скомпилирует, выполнит код и вернет новый объект ScriptState, так же можно повторно запустить скрипт обратившись к свойству Script, который хранит текущий объект Script для состояния. Для получения результата, есть свойство ReturnValue.
  22.  
  23. ScriptState state = await CSharpScript.RunAsync("int x = 0");
  24.  
  25. У объекта state можно посмотреть объявленные переменные, а так же полученный Exception
  26.  
  27. С помощью CSharpScript.Create можно создать делегат из скрипта, который будет запускать скрипт при вызове
  28.  
  29. А так же, можно скомпилировать лямбда-выражение в виде строки, используя CSharpScript.EvaluateAsync
  30.  
  31. var deleg = await CSharpScript.EvaluateAsync<Func<int, int>>("x => x * 2"); Console.WriteLine(deleg(5)); // 10
  32.  
  33. Дополнительные примеры можно найти по ссылкам внизу
  34.  
  35. https://github.com/dotnet/roslyn/blob/main/docs/wiki/Scripting-API-Samples.md
  36.  
  37. https://github.com/dotnet/roslyn/tree/a7319e2bc8cac34c34527031e6204d383d29d4ab/src/Scripting
Advertisement
Add Comment
Please, Sign In to add comment