aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs')
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs88
1 files changed, 88 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs
new file mode 100644
index 000000000..665bd7ab1
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs
@@ -0,0 +1,88 @@
+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
+ {
+ 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 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;
+ }
+ }
+}