Пример #1
0
 /// <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;
 }
Пример #2
0
        /// <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);
        }