aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs')
-rw-r--r--Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs73
1 files changed, 73 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..7e9bdd6e3
--- /dev/null
+++ b/Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs
@@ -0,0 +1,73 @@
+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; }
+
+ public ScriptEngine(OnExecuteParameters parameters)
+ {
+ _onExecuteParameters = parameters;
+ ReferencedAssemblies = new List<Type>();
+ }
+
+ 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);
+ }
+
+ public void Stop()
+ {
+ _cancaller.Cancel();
+ }
+ }
+}