diff options
Diffstat (limited to 'Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs | 73 |
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(); + } + } +} |
