/// <summary> /// BasicIconLogicService /// </summary> public BasicIconLogicService(IInstanceResolverHelper instanceResolverHelper, IPluginService pluginService, IPluginBasicConfigHelper pluginBasicConfigHelper, IIconConfigHelper iconConfigHelper, IProcessHelper processHelper) { InstanceResolverHelper = instanceResolverHelper; PluginService = pluginService; PluginBasicConfigHelper = pluginBasicConfigHelper; IconConfigHelper = iconConfigHelper; ProcessHelper = processHelper; }
/// <inheritdoc /> public IEnumerable <PluginInfo> LoadPlugins(IEnumerable <PluginInfo> currentCatalog, IEnumerable <string> pluginPaths, IInstanceResolverHelper resolverHelper, RegistrantFinderBuilder registrantFinderBuilder = null, IEnumerable <string> forcedPlugins = null) { var registrantBuilder = registrantFinderBuilder ?? new RegistrantFinderBuilder(); var forced = forcedPlugins?.ToArray() ?? new string[0]; var catalog = currentCatalog?.ToArray() ?? new PluginInfo[0]; var dirs = pluginPaths.Select(x => new DirectoryInfo(x)).Where(x => x.Exists); var excludedPrefix = new[] { "System.", "Microsoft.", "SimplyAnIcon.Plugins", "SimplyAnIcon.Common", "SimplyAnIcon.Core", "netstandard.dll" }; var dlls = dirs.SelectMany(dir => dir.GetFiles("*.dll", SearchOption.AllDirectories)) .Where(d => excludedPrefix.All(x => !d.Name.StartsWith(x))).ToArray(); if (!dlls.Any()) { return(catalog); } var assemblies = dlls.Select(x => Assembly.LoadFile(x.FullName)).ToList(); assemblies.ForEach(x => registrantBuilder.AddAssembly(x)); var pTypes = assemblies.SelectMany(x => x.DefinedTypes.Where(p => p.IsClass && !p.IsAbstract && typeof(ISimplyAPlugin).IsAssignableFrom(p))) .ToArray(); resolverHelper.EverythingIsRegistered(registrantBuilder.Build().GetAllRegistrations()); var plugins = pTypes .Select(resolverHelper.Resolve) .Cast <ISimplyAPlugin>() .ToArray(); var pluginSettings = _pluginSettings.GetPlugins().ToArray(); foreach (var plugin in plugins.Where(p => pluginSettings.All(x => x.Name != _pluginSettings.GetPluginName(p)))) { _pluginSettings.AddPlugin(plugin); } var newCatalog = plugins .Select(x => new { Plugin = x, Setting = _pluginSettings.GetPluginSetting(x) }) .OrderBy(x => x.Setting?.Order ?? -1) .Select(x => new PluginInfo { Plugin = catalog.FirstOrDefault(o => o.Plugin.Name == x.Plugin.Name)?.Plugin ?? x.Plugin, IsActivated = forced.Contains(x.Setting?.Name) || (x.Setting?.IsActive ?? false), IsNew = catalog.All(o => o.Plugin.Name != x.Plugin.Name) }) .ToArray(); foreach (var plugin in newCatalog.Where(x => x.IsNew).ToArray()) { try { plugin.Plugin.OnInit(_pluginBasicConfigHelper.GetPluginBasicConfig()); } catch { newCatalog = newCatalog.Except(new[] { plugin }).ToArray(); } } return(newCatalog); }