public IEnumerable<IPluginManager> Refresh() { var infos = _repo.List<PluginInfo>(); // Load all plugins from path var path = HdknConfig.GetPath("Paths.Plugins"); foreach(var info in _fs.GetFileSystemInfos(path)) { if(_loaders.Any(l => l.CanLoad(info.FullName)) && infos.All(i => i.Path != info.FullName)) { Logger.Info("Found new plugin {0}", info.FullName); var pluginInfo = new PluginInfo {Path = info.FullName}; _repo.Save(pluginInfo); infos.Add(pluginInfo); } } // load all PluginInfo where Name not in _managers.Keys var ret = new List<IPluginManager>(); foreach (PluginInfo info in infos) { try { var manager = new DefaultPluginManager(info, _mbus, _runner, _loaders); if (!_managers.ContainsKey(manager.Name)) { manager.Initialize(); manager.Install(); _managers.Add(manager.Name, manager); ret.Add(manager); } } catch(Exception e) { Logger.ErrorException(String.Format("Could not create plugin from path {0}", info.Path), e); } } return ret; }
public void Load(IEnumerable<byte[]> rawAssemblies) { var assemblies = rawAssemblies.Select(Assembly.Load).ToList(); // Run migrations foreach (var asm in assemblies) { _migrationRunner.Up(asm); } var childResolver = Kernel.Resolver.CreateChildResolver(assemblies); var plugin = childResolver.Get<IPlugin>(); var manager = new DefaultPluginManager(plugin); _messageBus.Send<IPluginLoading>(msg => { msg.Assemblies = assemblies.ToArray(); msg.Name = manager.Name; msg.Version = manager.Version; }).Wait(); try { manager.Load(); } catch (Exception e) { Logger.ErrorException(String.Format("Error when loading plugin '{0}'.", manager.Name), e); return; } _managers.Add(manager.Name, manager); _messageBus.Send<IPluginLoaded>(msg => { msg.Manager = manager; }); }