2016-07-13 3 views
0

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; 
    } 
} 

Antwort

0

Ich denke, Sie fragen, wie Sie verhindern können, dass alle Plugins in die aktuelle Appdomain geladen werden? Verwenden Sie in diesem Fall Assembly.ReflectionOnlyLoadFrom, suchen Sie das gesuchte Plug-in und rufen Sie Assembly.Load nur für dieses einzelne Plugin auf.

Verwandte Themen