Wenn ich gehe, um eine DLL über OpenFile
zu laden, wird die gesamte Sammlung von Plugins in die Baugruppe geladen. Ich brauche es nur, um ein einzelnes Plugin mit dem String-Namen, der in der IPlugin
Schnittstelle festgelegt wurde, zu laden.Wie bekomme ich einen einzigen generischen Typ anstelle der gesamten Sammlung
Wie kann ich nur das spezifische Plugin laden, das ich laden möchte?
public static class GenericPluginLoader<T>
{
public static ICollection<T> LoadPlugins(string path)
{
string[] dllFileNames = null;
if(Directory.Exists(path))
{
dllFileNames = Directory.GetFiles(path, "*.dll");
ICollection<Assembly> assemblies = new List<Assembly>(dllFileNames.Length);
foreach(string dllFile in dllFileNames)
{
AssemblyName an = AssemblyName.GetAssemblyName(dllFile);
Assembly assembly = Assembly.Load(an);
assemblies.Add(assembly);
}
Type pluginType = typeof(T);
// Type pluginType = .GetType();
ICollection<Type> pluginTypes = new List<Type>();
foreach(Assembly assembly in assemblies)
{
if(assembly != null)
{
Type[] types = assembly.GetTypes();
foreach(Type type in types)
{
if(type.IsInterface || type.IsAbstract)
{
continue;
}
else
{
if(type.GetInterface(pluginType.FullName) != null)
{
pluginTypes.Add(type);
}
}
}
}
}
ICollection<T> plugins = new List<T>(pluginTypes.Count);
foreach(Type type in pluginTypes)
{
T plugin = (T)Activator.CreateInstance(type);
plugins.Add(plugin);
}
return plugins;
}
return null;
}
}