diff options
| author | Avi Levkovich <avi@twine-s.com> | 2017-12-10 11:18:02 +0200 |
|---|---|---|
| committer | Avi Levkovich <avi@twine-s.com> | 2017-12-10 11:18:02 +0200 |
| commit | f8c0a7d42104cf01ef6c3b0d51503a91ee0d7047 (patch) | |
| tree | aa28e09c5d4c4a7da8e5fe5e00ffe355f6fc5a3f /Software/Visual_Studio/Tango.Scripting/ScriptEngine.cs | |
| parent | 8eec69d8933841f4e45fd9e63010bff51ae64a27 (diff) | |
| parent | 9a34f6f6456702440ecd50f902e59daa2ea77595 (diff) | |
| download | Tango-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.cs | 85 |
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(); + } + } +} |
