diff options
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Basic')
6 files changed, 106 insertions, 62 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs index fc48bb2a2..c76fba8e2 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/GlobalObject.cs @@ -6,8 +6,8 @@ using System.Threading.Tasks; namespace Tango.Scripting.Basic { - public class GlobalObject + public class GlobalObject<T> where T : IContext { - public IContext GlobalContext { get; set; } + public T GlobalContext { get; set; } } } diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs index 31be3a714..446e5b529 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs @@ -15,10 +15,11 @@ using Tango.Core; using Tango.Core.IO; using Tango.Scripting.Core; using System.IO; +using Tango.Core.Helpers; namespace Tango.Scripting.Basic { - public class Project : ExtendedObject + public class Project<T> : ExtendedObject where T : IContext { private String _name; public String Name @@ -38,11 +39,9 @@ namespace Tango.Scripting.Basic public ObservableCollection<ReferenceAssembly> ReferenceAssemblies { get; set; } - [JsonIgnore] - public ObservableCollection<Assembly> ReferenceAssembliesLoaded { get; set; } - public ObservableCollection<Script> Scripts { get; set; } + [JsonIgnore] public ObservableCollection<IScriptSource> AdditionalScripts { get @@ -56,38 +55,20 @@ namespace Tango.Scripting.Basic ApartmentState = ApartmentState.MTA; ReferenceAssemblies = new ObservableCollection<ReferenceAssembly>(); - ReferenceAssemblies.CollectionChanged += ReferenceAssemblies_CollectionChanged; - ReferenceAssembliesLoaded = new ObservableCollection<Assembly>(); Scripts = new ObservableCollection<Script>(); Scripts.CollectionChanged += (x, e) => { RaisePropertyChanged(nameof(AdditionalScripts)); }; } - private void ReferenceAssemblies_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) - { - LoadReferenceAssemblies(); - } - - private void LoadReferenceAssemblies() + public static TProject New<TProject, TContext>(String name) where TProject : Project<TContext> where TContext : IContext { - ReferenceAssembliesLoaded.Clear(); - - foreach (var type in ReferenceAssemblies) - { - ReferenceAssembliesLoaded.Add(type.FromType.Assembly); - } - } - - public static Project New(String name) - { - Project p = new Project(); + TProject p = Activator.CreateInstance<TProject>(); p.Name = name; - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(String) }); - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Enumerable) }); - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Form) }); - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Project) }); + p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(String))); + p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Enumerable))); + p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Form))); return p; } @@ -140,14 +121,14 @@ namespace Tango.Scripting.Basic } else { - code += Environment.NewLine + Environment.NewLine + "return new Program().OnExecute(GlobalContext);"; + code += Environment.NewLine + Environment.NewLine + "new Program().OnExecute(GlobalContext);"; mainScriptCode = code; } } - var scriptOptions = ScriptOptions.Default.WithReferences(ReferenceAssembliesLoaded); + var scriptOptions = ScriptOptions.Default.WithReferences(LoadReferenceAssemblies()); - var s = CSharpScript.Create<object>(mainScriptCode, scriptOptions, typeof(GlobalObject)); + var s = CSharpScript.Create<object>(mainScriptCode, scriptOptions, typeof(GlobalObject<T>)); result.Script = s; var compileResults = s.Compile(); @@ -164,7 +145,7 @@ namespace Tango.Scripting.Basic cError.Message = error.GetMessage(); cError.Severity = error.Severity; var line = error.Location.GetMappedLineSpan(); - cError.Line = line.StartLinePosition.Line + 1 + (errorScript != null ? errorScript.LoadCount : 0); + cError.Line = line.StartLinePosition.Line + 1 - (errorScript != null ? errorScript.LoadCount : 0); cError.Column = line.StartLinePosition.Character + 1; cError.Length = line.EndLinePosition.Character - line.StartLinePosition.Character; result.Errors.Add(cError); @@ -174,7 +155,7 @@ namespace Tango.Scripting.Basic }); } - public async Task<ProjectSession> Run(IContext context) + public async Task<ProjectSession<T>> Run(T context) { var result = await Compile(); @@ -184,9 +165,9 @@ namespace Tango.Scripting.Basic } Thread scriptThread = null; - ProjectSession session = null; + ProjectSession<T> session = null; - session = new ProjectSession(this, () => + session = new ProjectSession<T>(this, () => { scriptThread.Abort(); }); @@ -195,7 +176,7 @@ namespace Tango.Scripting.Basic { try { - var runResult = result.Script.RunAsync(globals: new GlobalObject() { GlobalContext = context }).Result; + var runResult = result.Script.RunAsync(globals: new GlobalObject<T>() { GlobalContext = context }).Result; session.Completed(runResult.ReturnValue); } catch (ThreadAbortException) @@ -214,5 +195,17 @@ namespace Tango.Scripting.Basic return session; } + + public List<Assembly> LoadReferenceAssemblies() + { + List<Assembly> loadedAssemblies = new List<Assembly>(); + + foreach (var asm in ReferenceAssemblies) + { + loadedAssemblies.Add(asm.Load()); + } + + return loadedAssemblies; + } } } diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectManager.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectManager.cs deleted file mode 100644 index 3af7530bc..000000000 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectManager.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Tango.Scripting.Basic -{ - public class ProjectManager - { - public Project Project { get; set; } - - public ProjectManager(Project project) - { - Project = project; - } - } -} diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs index 565949402..6bd3d44b9 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ProjectSession.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Tango.Scripting.Basic { - public class ProjectSession + public class ProjectSession<T> where T : IContext { private Action _abortAction; private TaskCompletionSource<object> _completion; @@ -15,9 +15,9 @@ namespace Tango.Scripting.Basic public ProjectSessionState State { get; set; } - public Project Project { get; set; } + public Project<T> Project { get; set; } - public ProjectSession(Project project, Action abortAction) + public ProjectSession(Project<T> project, Action abortAction) { _completion = new TaskCompletionSource<object>(); Project = project; diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs index be66e026b..665bd7ab1 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs @@ -1,18 +1,88 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; +using Tango.Core.Helpers; namespace Tango.Scripting.Basic { public class ReferenceAssembly { - public Type FromType { get; set; } + private static Dictionary<String, Assembly> _assembliesCache; + static ReferenceAssembly() + { + _assembliesCache = new Dictionary<string, Assembly>(); + } + + public String File { get; set; } + + public Type HintType { get; set; } + + [JsonIgnore] public String Name { - get { return FromType.Assembly.GetName().Name; } + get { return Path.GetFileNameWithoutExtension(File); } + } + + public static ReferenceAssembly FromType(Type type) + { + ReferenceAssembly reference = new ReferenceAssembly(); + reference.HintType = type; + var assembly = type.Assembly; + reference.File = assembly.Location; + return reference; + } + + public static ReferenceAssembly FromFile(String file) + { + return new ReferenceAssembly() { File = file }; + } + + public Assembly Load() + { + Assembly loaded = null; + if (!_assembliesCache.TryGetValue(Name, out loaded)) + { + try + { + if (HintType != null) + { + loaded = HintType.Assembly; + } + else + { + loaded = Assembly.LoadFrom(File); + } + + _assembliesCache.Add(Name, loaded); + } + catch + { + try + { + String dotNetPath = AssemblyHelper.GetAssemblyTargetFrameworkFolder(Assembly.GetExecutingAssembly()); + String dotNetAsm = Path.Combine(dotNetPath, Name + ".dll"); + loaded = Assembly.LoadFrom(dotNetAsm); + _assembliesCache.Add(Name, loaded); + } + catch (Exception ex) + { + throw new FileNotFoundException($"Could not load assembly '{Name}'. File not found.", ex); + } + } + } + + return loaded; + } + + public override string ToString() + { + return Name; } } } diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj index 8af52748a..be52ca57a 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Tango.Scripting.Basic.csproj @@ -136,7 +136,6 @@ <Compile Include="CompilationResult.cs" /> <Compile Include="GlobalObject.cs" /> <Compile Include="Project.cs" /> - <Compile Include="ProjectManager.cs" /> <Compile Include="ReferenceAssembly.cs" /> <Compile Include="Properties\AssemblyInfo.cs"> <SubType>Code</SubType> |
