Allow plugins to be activated if merged flag set

reduce some nesting
This commit is contained in:
Kurt 2018-07-23 21:36:26 -07:00
parent 8cb82560f6
commit b59ebb3002
2 changed files with 33 additions and 17 deletions

View file

@ -259,8 +259,10 @@ namespace PKHeX.WinForms
}
private void FormLoadPlugins()
{
#if !MERGED // merged should load dlls from within too, folder is no longer required
if (!Directory.Exists(PluginPath))
return;
#endif
Plugins.AddRange(PluginLoader.LoadPlugins<IPlugin>(PluginPath));
foreach (var p in Plugins.OrderBy(z => z.Priority))
p.Initialize(C_SAV, PKME_Tabs, menuStrip1);

View file

@ -15,38 +15,52 @@ namespace PKHeX.WinForms
var pluginTypes = GetPluginsOfType<T>(assemblies);
return LoadPlugins<T>(pluginTypes);
}
private static IEnumerable<T> LoadPlugins<T>(IEnumerable<Type> pluginTypes)
{
return pluginTypes.Select(type => (T)Activator.CreateInstance(type));
}
private static IEnumerable<Assembly> GetAssemblies(IEnumerable<string> dllFileNames)
{
#if UNSAFEDLL
return dllFileNames.Select(Assembly.UnsafeLoadFrom);
var assemblies = dllFileNames.Select(Assembly.UnsafeLoadFrom);
#else
return dllFileNames.Select(Assembly.LoadFrom);
var assemblies = dllFileNames.Select(Assembly.LoadFrom);
#endif
#if MERGED
assemblies = assemblies.Concat(new[] { Assembly.GetExecutingAssembly() }); // load merged too
#endif
return assemblies;
}
private static IEnumerable<Type> GetPluginsOfType<T>(IEnumerable<Assembly> assemblies)
{
var pluginType = typeof(T);
foreach (var z in assemblies.Where(z => z != null))
return assemblies.Where(z => z != null).SelectMany(z => GetPluginTypes(z, pluginType));
}
private static IEnumerable<Type> GetPluginTypes(Assembly z, Type pluginType)
{
try
{
Type[] types; try { types = z.GetTypes(); }
catch (Exception ex)
{
Console.WriteLine($"Unable to load plugin [{pluginType.Name}]: {z.FullName}", ex.Message);
continue;
}
foreach (Type type in types)
{
if (type.IsInterface || type.IsAbstract)
continue;
if (type.GetInterface(pluginType.FullName) == null)
continue;
yield return type;
}
var types = z.GetTypes();
return types.Where(type => IsTypePlugin(type, pluginType));
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Unable to load plugin [{pluginType.Name}]: {z.FullName}", ex.Message);
return Enumerable.Empty<Type>();
}
}
private static bool IsTypePlugin(Type type, Type pluginType)
{
if (type.IsInterface || type.IsAbstract)
return false;
if (type.GetInterface(pluginType.FullName) == null)
return false;
return true;
}
}
}