aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2017-12-10 11:18:02 +0200
committerAvi Levkovich <avi@twine-s.com>2017-12-10 11:18:02 +0200
commitf8c0a7d42104cf01ef6c3b0d51503a91ee0d7047 (patch)
treeaa28e09c5d4c4a7da8e5fe5e00ffe355f6fc5a3f /Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
parent8eec69d8933841f4e45fd9e63010bff51ae64a27 (diff)
parent9a34f6f6456702440ecd50f902e59daa2ea77595 (diff)
downloadTango-f8c0a7d42104cf01ef6c3b0d51503a91ee0d7047.tar.gz
Tango-f8c0a7d42104cf01ef6c3b0d51503a91ee0d7047.zip
MERGE.
Diffstat (limited to 'Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs')
-rw-r--r--Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs85
1 files changed, 85 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs b/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
new file mode 100644
index 000000000..52f595c3e
--- /dev/null
+++ b/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
@@ -0,0 +1,85 @@
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp.Scripting;
+using Microsoft.CodeAnalysis.Scripting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Tango.Scripting
+{
+ public class ScriptEngine
+ {
+ private CancellationTokenSource _cancaller;
+ private OnExecuteParameters _onExecuteParameters;
+ public List<Type> ReferencedAssemblies { get; private set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ScriptEngine"/> class.
+ /// </summary>
+ /// <param name="parameters">The parameters.</param>
+ public ScriptEngine(OnExecuteParameters parameters)
+ {
+ _onExecuteParameters = parameters;
+ ReferencedAssemblies = new List<Type>();
+ }
+
+ /// <summary>
+ /// Runs the specified code.
+ /// </summary>
+ /// <param name="code">The code.</param>
+ /// <returns></returns>
+ public async Task Run(String code)
+ {
+ //My References.
+ var options = ScriptOptions.Default;
+
+ //External References.
+ //foreach (var r in item.References)
+ //{
+ // options = options.AddReferences(r.FilePath);
+ //}
+
+ //My Assemblies.
+ options = options.AddReferences(typeof(Form).Assembly.Location);
+ options = options.AddReferences(typeof(Enumerable).Assembly.Location);
+ options = options.AddReferences(typeof(ScriptEngine).Assembly.Location);
+
+ foreach (var asm in ReferencedAssemblies)
+ {
+ options = options.AddReferences(asm.Assembly.Location);
+ }
+
+ //Imports.
+ options = options.AddImports(
+ "System",
+ "System.Collections.Generic",
+ "System.Linq",
+ "System.Text",
+ "System.Diagnostics",
+ "System.Windows.Forms"
+ );
+
+ String methodParameters = String.Join(", ", _onExecuteParameters.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance).Select(x => x.Name));
+
+ _cancaller = new CancellationTokenSource();
+ await CSharpScript.RunAsync(
+ code +
+ Environment.NewLine +
+ Environment.NewLine +
+ "await Task.Factory.StartNew(() => { OnExecute(" + methodParameters + "); });", options: options, globals: _onExecuteParameters, cancellationToken: _cancaller.Token);
+ }
+
+ /// <summary>
+ /// Stops this instance.
+ /// </summary>
+ public void Stop()
+ {
+ _cancaller.Cancel();
+ }
+ }
+}