Exemple #1
0
 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);
            }
        }