namespace dotless.Core.Plugins { using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.IO; using System.ComponentModel; public static class PluginFinder { /// /// Gets a plugins name /// public static string GetName(this IPlugin plugin) { return GetName(plugin.GetType()); } /// /// Gets a plugins description /// public static string GetDescription(this IPlugin plugin) { return GetName(plugin.GetType()); } /// /// Gets a plugins description from its type /// public static string GetDescription(Type pluginType) { DescriptionAttribute description = pluginType .GetCustomAttributes(typeof(DescriptionAttribute), true) .FirstOrDefault() as DescriptionAttribute; if (description != null) return description.Description; else return "No Description"; } /// /// Gets a plugins name from its type /// public static string GetName(Type pluginType) { DisplayNameAttribute name = pluginType .GetCustomAttributes(typeof(DisplayNameAttribute), true) .FirstOrDefault() as DisplayNameAttribute; if (name != null) return name.DisplayName; else return pluginType.Name; } /// /// Gets plugin configurators for all plugins, optionally scanning referenced assemblies and /// a plugins folder underneath the executing assembly /// /// Look for a plugins folder and if exists, load plugins from it /// public static IEnumerable GetConfigurators(bool scanPluginsFolder) { List> pluginConfigurators = new List>(); pluginConfigurators.Add(GetConfigurators(Assembly.GetAssembly(typeof(PluginFinder)))); if (scanPluginsFolder) { string assemblyLocation = Assembly.GetEntryAssembly().Location; string pluginsFolder = Path.Combine(Path.GetDirectoryName(assemblyLocation), "plugins"); if (Directory.Exists(pluginsFolder)) { DirectoryInfo pluginsFolderDirectoryInfo = new DirectoryInfo(pluginsFolder); foreach(FileInfo pluginAssembly in pluginsFolderDirectoryInfo.GetFiles("*.dll")) { pluginConfigurators.Add(GetConfigurators(Assembly.LoadFile(pluginAssembly.FullName))); } } } return pluginConfigurators.Aggregate((group1, group2) => group1.Union(group2)); } /// /// Gets plugin configurators for every plugin in an assembly /// /// /// public static IEnumerable GetConfigurators(Assembly assembly) { IEnumerable types = assembly.GetTypes().Where( type => !type.IsAbstract && !type.IsGenericType && !type.IsInterface); IEnumerable pluginConfigurators = types .Where(type => typeof(IPluginConfigurator).IsAssignableFrom(type)) .Select(type => (IPluginConfigurator)type.GetConstructor(new Type[] {}).Invoke(new object[]{})); IEnumerable pluginsConfigurated = pluginConfigurators.Select(pluginConfigurator => pluginConfigurator.Configurates); Type genericPluginConfiguratorType = typeof(GenericPluginConfigurator<>); IEnumerable plugins = types .Where(type => typeof(IPlugin).IsAssignableFrom(type)) .Where(type => !pluginsConfigurated.Contains(type)) .Select(type => (IPluginConfigurator)Activator.CreateInstance(genericPluginConfiguratorType.MakeGenericType(type))); return plugins.Union(pluginConfigurators); } } }