static public Result <string, SubmissionResponseValueStructure> EvaluateSubmissionAndGetResultingValue( JavaScriptEngineSwitcher.Core.IJsEngine evalElmPreparedJsEngine, Composition.TreeComponent appCodeTree, string submission, IReadOnlyList <string> previousLocalSubmissions = null) { var modulesTexts = appCodeTree == null ? null : ElmApp.ToFlatDictionaryWithPathComparer( appCodeTree.EnumerateBlobsTransitive() .Select(file => (filePath: (IImmutableList <string>)file.path.Select(pathComponent => Encoding.UTF8.GetString(pathComponent.ToArray())).ToImmutableList(), content: file.blobContent))) .Select(appCodeFile => appCodeFile.Key.Last().EndsWith(".elm") ? Encoding.UTF8.GetString(appCodeFile.Value.ToArray()) : null) .WhereNotNull() .ToImmutableList(); var argumentsJson = Newtonsoft.Json.JsonConvert.SerializeObject( new { modulesTexts = modulesTexts ?? ImmutableList <string> .Empty, submission = submission, previousLocalSubmissions = previousLocalSubmissions ?? ImmutableList <string> .Empty, } ); var responseJson = evalElmPreparedJsEngine.CallFunction("evaluateSubmissionInInteractive", argumentsJson) ?.ToString(); var responseStructure = Newtonsoft.Json.JsonConvert.DeserializeObject <EvaluateSubmissionResponseStructure>( responseJson); if (responseStructure.DecodedArguments == null) { throw new Exception("Failed to decode arguments: " + responseStructure.FailedToDecodeArguments); } if (responseStructure.DecodedArguments.Evaluated == null) { return(Result <string, SubmissionResponseValueStructure> .err(responseStructure.DecodedArguments.FailedToEvaluate)); } return(Result <string, ElmEngine.EvaluateElm.SubmissionResponseValueStructure> .ok( responseStructure.DecodedArguments.Evaluated.SubmissionResponseValue)); }
static public Result <string, EvaluatedSctructure> EvaluateSubmissionAndGetResultingValue( JavaScriptEngineSwitcher.Core.IJsEngine evalElmPreparedJsEngine, TreeWithStringPath?appCodeTree, string submission, IReadOnlyList <string>?previousLocalSubmissions = null) { var modulesTexts = appCodeTree == null ? null : TreeToFlatDictionaryWithPathComparer(compileTree(appCodeTree) !) .Select(appCodeFile => appCodeFile.Key.Last().EndsWith(".elm") ? Encoding.UTF8.GetString(appCodeFile.Value.ToArray()) : null) .WhereNotNull() .ToImmutableList(); var argumentsJson = System.Text.Json.JsonSerializer.Serialize( new { modulesTexts = modulesTexts ?? ImmutableList <string> .Empty, submission = submission, previousLocalSubmissions = previousLocalSubmissions ?? ImmutableList <string> .Empty, } ); var responseJson = evalElmPreparedJsEngine.CallFunction("evaluateSubmissionInInteractive", argumentsJson).ToString() !; var responseStructure = System.Text.Json.JsonSerializer.Deserialize <EvaluateSubmissionResponseStructure>(responseJson) !; if (responseStructure.DecodedArguments == null) { throw new Exception("Failed to decode arguments: " + responseStructure.FailedToDecodeArguments); } if (responseStructure.DecodedArguments.Evaluated == null) { return(Result <string, EvaluatedSctructure> .err(responseStructure.DecodedArguments.FailedToEvaluate !)); } return(Result <string, EvaluatedSctructure> .ok( responseStructure.DecodedArguments.Evaluated)); }
public static JavaScriptEngineSwitcher.Core.IJsEngine CreateEngine() { var engineSwitcher = JavaScriptEngineSwitcher.Core.JsEngineSwitcher.Current; engineSwitcher.EngineFactories.Add(new JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngineFactory()); engineSwitcher.DefaultEngineName = JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.EngineName; JavaScriptEngineSwitcher.Core.IJsEngine engine = JavaScriptEngineSwitcher.Core.JsEngineSwitcher.Current.CreateDefaultEngine(); // C#中设置JS变量值 engine.SetVariableValue("pi", 3.1415926); // C#向JS注入类型 //engine.EmbedHostType("Console", typeof(JsConsole)); // C#向JS注入对象 engine.EmbedHostObject("console", new JsConsole()); engine.EmbedHostObject("math", new JsMath()); engine.EmbedHostObject("file", new JsFile()); //engine.EmbedHostObject("File", typeof(JsFile)); engine.SetVariableValue("jsEngineVersion", engine.Version); engine.Execute("function version(){ \r\n return jsEngineVersion; \r\n}"); engine.Execute("function print(arg){ \r\n console.log(arg); \r\n}"); return(engine); }
public static void Init(string[] args) { // ½âÎö²ÎÊý // - Console.WriteLine($"command arguments: '{string.Join("','", args)}'"); Console.WriteLine($"run dic: {AppContext.BaseDirectory}"); if (args.Length > 0) { switch (args[0]) { case "run": if (args.Length > 1) { var arg = args[1]; if (arg == "js") { if (args.Length > 2) { var code = args[2]; using (JavaScriptEngineSwitcher.Core.IJsEngine engine = JavaScript.JsEngine.CreateEngine()) { Console.WriteLine($"out:{"".PadRight(40, '-')}"); engine.Execute(code); Console.WriteLine($"out:{"".PadRight(40, '-')}"); } } } var path = System.IO.Path.GetFullPath(arg); Console.WriteLine($"source code file: {path}"); if (System.IO.File.Exists(path)) { var sourceCode = System.IO.File.ReadAllText(path); Console.WriteLine($"src:{"".PadRight(40, '-')}"); Console.WriteLine(sourceCode); Console.WriteLine($"src:{"".PadRight(40, '-')}"); if (System.IO.Path.HasExtension(".ws")) { ILexer lexer = new Lexer(); } if (System.IO.Path.HasExtension(".js")) { using (JavaScriptEngineSwitcher.Core.IJsEngine engine = JavaScript.JsEngine.CreateEngine()) { Console.WriteLine($"out:{"".PadRight(40, '-')}"); // Ö´ÐÐJS½Å±¾Îļþ engine.ExecuteFile(path); //engine.Execute("var a=1+3;if(1)a=5;TestA.Name=a"); Console.WriteLine($"out:{"".PadRight(40, '-')}"); } } #region << ¶¯Ì¬±àÒëC#´úÂë >> // if (System.IO.Path.HasExtension(".cs")) // { // CSharpCodeProvider provider = new CSharpCodeProvider(); // ICodeCompiler compiler = provider.CreateCompiler(); // CompilerParameters parameters = new CompilerParameters(); // parameters.ReferencedAssemblies.Add("System.dll"); // parameters.GenerateExecutable = false; // parameters.GenerateInMemory = true; // CompilerResults cr = compiler.CompileAssemblyFromSource(parameters, sourceCode); // if(cr.Errors.HasErrors){ // Console.WriteLine("±àÒë´íÎó£º"); // Console.WriteLine(string.Join(Environment.NewLine // , cr.Errors.Cast<CompilerError>() // .Select(err => err.ErrorText))); // } // else { // Assembly assembly = cr.CompiledAssembly; // var type = assembly.GetType("Program"); // // type.InvokeMember() // } // } #endregion } } break; default: break; } } }
public JsEngine(JavaScriptEngineSwitcher.Core.IJsEngine engine) { _engine = engine; }