ClearScript. Добавь скрипты в своё .NET приложение
Были времена, когда обработку скриптов в .NET реализовывали проекты IronPython и IronRuby. IronRuby уже умер, IronPython ещё жив, но надо признать, что не набрал популярности несмотря на солидный возраст. Если вам требуется использовать сценарии в своём .NET приложении обратите внимание на ClearScript.
ClearScript - это библиотека, которая с лёгкостью добавит сценарии на JavaScript (через V8 и JScript) или VBScript в ваше .NET приложение. ClearScript поддерживает несколько видов движков: Google’s V8, Microsoft’s JScript и VBScript. Посредством ClearScript можно запускать JavaScript сценарии как в старом CommonJS, так и в новой ES6 стандарте, причем сценарии будут работать как в Windows, Linux, так и macOS. Количество поддержанных фишек для разных движков несколько различается, но V8 содержит их в максимальном количестве. ClearScript доступен в виде NuGet пакетов для соответствующих платформ.
Для работы с ClearScript требуется подключить следующие пространства имён:
1 2 3
using Microsoft.ClearScript; using Microsoft.ClearScript.JavaScript; using Microsoft.ClearScript.V8;
Создать и инициализировать движок скриптов (если не требуется возможность отладки, то V8ScriptEngineFlags.EnableDebugging убрать, оставив просто new() ):
Запуск вычислений в сценарии на JS приводится ниже:
1 2 3 4 5
var result = Engine.Evaluate( new DocumentInfo {Category = ModuleCategory.Standard}, $"{_jsModuleContent}{PdpFunctionName}({JsonSerializer.Serialize(initialDevice)})" ); var resultDevice = JsonSerializer.Deserialize<Device>(result.ToString());
Category = ModuleCategory.Standard означает, что текст сценария написан на ES6 (const, let, import, etc). Category = ModuleCategory.CommonJS - старый формат JS, понимающий только var и require. Из примера видно, что текстовый аргумент представляет из себя содержимое сценария и вызов JS функции с передачей ей в качестве аргумента сериализованного объекта JSON. В качестве результата возвращается экземпляр класса Object, который требуется десериализовать к нужному классу с помощью JsonSerializer.Deserialize. Таким образом, с помощью загрузки и исполнения JavaScript сценария можно динамически управлять выполняющимися инструкциями функции PdpFunctionName!
Удивительно, что можно подгружать классы .NET в движок ClearScript (в том числе даты, дженерики и LINQ) и использовать их для вычислений:
using (var engine = new V8ScriptEngine()) // создание движка { engine.AddHostType("Console", typeof(Console)); // прокинуть тип в движок engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)"); // 3.14159265358979 is an interesting number.
engine.AddHostObject("random", new Random()); // прокинуть объект в движок engine.Execute("Console.WriteLine(random.NextDouble())"); // 0.715555223503874
// создаем хост-объект прямо из скрипта engine.Execute(@" birthday = new lib.System.DateTime(2007, 5, 22); Console.WriteLine(birthday.ToLongDateString()); "); // Tuesday, May 22, 2007
// используем дженерик класс словаря прямо из скрипта engine.Execute(@" Dictionary = lib.System.Collections.Generic.Dictionary; dict = new Dictionary(lib.System.String, lib.System.Int32); dict.Add('foo', 123); ");
engine.AddHostObject("host", new HostFunctions()); // вызываем хост-метод с out параметром engine.Execute(@" intVar = host.newVar(lib.System.Int32); found = dict.TryGetValue('foo', intVar.out); Console.WriteLine('{0} {1}', found, intVar); "); // True 123