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*