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 _assembliesCache; static ReferenceAssembly() { _assembliesCache = new Dictionary(); } 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; } } }