Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.613 Beiträge
 
#5

AW: Womit höchstmodulare WPF-Anwendungen erstellen?

  Alt 21. Mär 2011, 07:39
Naja, ein paar Zeilen mehr sinds schon.

Erstmal alle Files die mit .dll enden laden:

Code:
foreach (var file in Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll"))
{
   try
   {
      Assembly.LoadFrom(file);
   }
   catch { } // fine here. Existing .dll could be a native library
}
Nun hast Du alle Assemblies verfügbar und kannst daraus alle Typen ermitteln, die Du benötigst. Dazu gibts ne kleine Helfermethode:

Code:
private static List<Type> FindTypes<T>()
{
  return AppDomain.CurrentDomain.GetAssemblies()
    .Select(a => a.GetTypes())
        .SelectMany(a =>
          a.Where(t => t.IsClass && !t.IsAbstract && typeof(T).IsAssignableFrom(t)))    
    .ToList();
}
Sagen wir Du hast ein Interface namens IMyPlugin und das definiert ne Methode Load() dem Du Deinen Plugin-Host übergibtst, dann initialisierst Du alle Plugins so:

Code:
foreach (var pluginType in FindTypes<IMyPlugin>())
{
    IMyPlugin instance = (IMyInterface) Activator.CreateInstance(pluginType);
    instance.Load(this); // oder whatever halt  
}
In load können die sich dann in ne List<IMyPlugin> auf dem Host legen oder Du merkst Sie Dir irgendwie anders.

Wenn Du nicht gleich alle instanzieren willst kannst Du natürlich auch einfach die Typen aus der Liste anzeigen und nur einzelne instanzieren. Mittels Custom Attributen kannst Du auch noch weitere Informationen zu den Plugins ausgeben etc. .NET ist da ziemlich mächtig *g*
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org

Geändert von Phoenix (21. Mär 2011 um 07:40 Uhr) Grund: Cast vergessen beim instanzieren...
  Mit Zitat antworten Zitat