public void SetEnvironment(ExtensionManager extensionManager, EventRouter eventRouter, CronTab cronTab, BaseStorage storage, string rootPath) { ExtensionManager.GetInstance(extensionManager); EventRouter.GetInstance(eventRouter); //AppDomain.MonitoringIsEnabled = true; AppDomain.CurrentDomain.AssemblyResolve += _currentAppDomain_AssemblyResolve; _loadedAssemblyList = new Dictionary <string, Assembly>(); _extensionList = new Dictionary <string, IExtension>(); _metaAssemblyList = new Dictionary <string, Assembly>(); IOManager.SetDefaultDataStorage(storage); IOManager.SetRootPath(rootPath); CronTab.GetInstance(cronTab); }
public void LoadExtension(string fileName, bool autoInitialize = false) { if (!File.Exists(fileName)) { return; } string assemblyName = Path.GetFileName(fileName); if (!_isUseSeparateAppdomain && Array.Find(AppDomain.CurrentDomain.GetAssemblies(), assembly => assembly.GetName().Name == Path.GetFileNameWithoutExtension(fileName)) != null) { Console.WriteLine( $"[Warning - {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}/ExtensionManager]:An existing extension has been loaded in default appdomain."); return; } ExtensionDomain existExtensionDomain = _extensionDomainList.Find(ed => ed.AssemblyName == assemblyName); if (existExtensionDomain != null && _isUseSeparateAppdomain) { existExtensionDomain.Proxy.Uninitialize(); _extensionDomainList.Remove(existExtensionDomain); } ExtensionProxy proxy; AppDomain ownerDomain; if (_isUseSeparateAppdomain) { Evidence evidence = new Evidence(); AppDomainSetup appDomainSetup = new AppDomainSetup(); appDomainSetup.ShadowCopyFiles = "true"; appDomainSetup.ApplicationBase = Environment.CurrentDirectory; appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; ownerDomain = AppDomain.CreateDomain(fileName, evidence, appDomainSetup); Type type = typeof(ExtensionProxy); proxy = (ExtensionProxy)ownerDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName); } else { ownerDomain = AppDomain.CurrentDomain; proxy = new ExtensionProxy(); } proxy.SetEnvironment(ExtensionManager.GetInstance(), EventRouter.GetInstance(), CronTab.GetInstance(), IOManager.GetDefaultDataStorage(), IOManager.GetRootPath()); proxy.LoadExtension(fileName); _extensionDomainList.Add(new ExtensionDomain() { Domain = ownerDomain, Proxy = proxy, AssemblyName = assemblyName, IsAbandoned = false }); if (autoInitialize) { proxy.Initialize(); } if (existExtensionDomain != null && _isUseSeparateAppdomain) { AppDomain.Unload(existExtensionDomain.Domain); } }