Example #1
0
        public virtual bool ActivatePlugin(string name)
        {
            IPlugin plugin = GetPlugin(name);

            if (plugin != null)
            {
                if (plugin.IsAlive)
                {
                    return(false);
                }

                plugin.Activate(false);
                return(plugin.IsAlive);
            }

            if (File.Exists(name))
            {
                Assembly asm = LoadCachedAssembly(name);
                plugin = LoadPluginFromAssembly(asm, out IDependencyContainer _);
                if (plugin == null)
                {
                    return(false);
                }

                if (!plugin.IsAlive)
                {
                    plugin.Activate(true);
                }
                return(true);
            }

            return(true);
        }
Example #2
0
 public void ActivatePlugins(IPlugin plugin)
 {
     if (!plugin.IsActivated)
     {
         _logger.Debug("Activating plugin {0}", plugin.GetType().Name);
         foreach (var services in plugin.Description.NeededServices)
         {
             _logger.Debug("Plugin for dependency {1} of plugin {0} will be searched", plugin.GetType().Name, services.Name);
             var dependencies    = _providedServices[services];
             var dependedPlugins = dependencies as IPlugin[] ?? dependencies.ToArray();
             if (!dependedPlugins.Any())
             {
                 //TODO Eigene Exception
                 throw new Exception(string.Format("Für das Plugin {0} können folgende Abhängigkeiten nicht aufgelöst werden: {1}",
                                                   plugin.Description.Name,
                                                   string.Join(", ", services.Name)));
             }
             foreach (var dependedPlugin in dependedPlugins)
             {
                 ActivatePlugins(dependedPlugin);
             }
         }
         plugin.Activate();
     }
     else
     {
         _logger.Debug("Skipping activation of plugin {0} because it is already active", plugin.GetType().Name);
     }
 }
Example #3
0
        /// <summary>
        /// Adds a plugin, activates it and registers it with the event dispatcher.
        /// </summary>
        /// <remarks>
        /// Ideally plugin packages should be registered via <see cref="ActivatePackages"/>, but if
        /// you use Bucket programmatically and want to register a plugin class
        /// directly this is a valid way to do it.
        /// </remarks>
        public virtual void ActivatePlugin(IPlugin plugin)
        {
            io.WriteError($"Loading plugin {plugin}.", true, Verbosities.Debug);

            plugins.Add(plugin);
            plugin.Activate(bucket, io);
            if (plugin is IEventSubscriber eventSubscriber)
            {
                bucket.GetEventDispatcher().AddSubscriber(eventSubscriber);
            }
        }
Example #4
0
        protected bool RegisterAndLoadPluginFromContainer(IDependencyContainer container)
        {
            IPlugin plugin = container.Resolve <IPlugin>();

            Logger.LogDebug($"[{GetType().Name}] Trying to load plugin: " + plugin.Name);

            PluginCommandProvider cmdProvider = new PluginCommandProvider(plugin, container);

            ParentContainer.RegisterSingletonInstance <ICommandProvider>(cmdProvider, plugin.Name);

            var    asm       = plugin.GetType().Assembly;
            string pluginDir = plugin.WorkingDirectory;

            //if (!Directory.Exists(pluginDir))
            //    Directory.CreateDirectory(pluginDir);

            foreach (string s in asm.GetManifestResourceNames())
            {
                using (Stream stream = asm.GetManifestResourceStream(s))
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        if (stream != null)
                        {
                            stream.CopyTo(ms);
                            byte[] data     = ms.ToArray();
                            string fileName = s.Replace(plugin.GetType().Namespace, "");
                            File.WriteAllBytes(Path.Combine(pluginDir, fileName), data);
                        }
                    }
                }
            }

            bool success = plugin.Activate(false);

            if (!success)
            {
                return(false);
            }

            IEnumerable <Type> listeners = plugin.FindTypes <IAutoRegisteredEventListener>(false);

            foreach (Type listener in listeners)
            {
                IAutoRegisteredEventListener instance = (IAutoRegisteredEventListener)container.Activate(listener);
                EventBus.AddEventListener(plugin, instance);
            }

            return(true);
        }
Example #5
0
 private static void Activate(IPlugin extension)
 {
     if (!extension.IsActive)
     {
         try
         {
             Trace.WriteLine("激活中: " + extension.AssemblyQualifiedName);
             extension.Activate();
         }
         catch (Exception ex)
         {
             Trace.WriteLine($"激活失败: {extension.AssemblyQualifiedName} {ex.Message} {ex.StackTrace}");
         }
     }
 }