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); }
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); } }
/// <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); } }
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); }
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}"); } } }