J'avais installé un petit système de plugin basé sur l'utilisation d'interfaces. Mais j'ai découvert que les interfaces ne pouvaient pas être sérialisées et tout mon système de sauvegarde dépend des fichiers de sérialisation, qui contiendront ces plugins. J'ai donc décidé d'échanger l'interface pour une classe abstraite. Ce qui a bien fonctionné. Mais il semble que ma solution actuelle nécessite une interface.Les assemblages peuvent-ils être chargés sans utiliser d'interfaces?
Les types pour l'assembly affichent uniquement null et Resources. Donc je devine juste que charger des assemblages de cette manière ne peut pas être fait avec des classes abstraites? Y a-t-il un moyen de le faire sans utiliser d'interfaces?
public List<EnginePluginBase> GetEnginePlugins(string directory)
{
if (string.IsNullOrEmpty(directory))
return null;
List<EnginePluginBase> plugins = new List<EnginePluginBase>();
foreach (FileInfo file in new DirectoryInfo(directory).GetFiles("*.dll"))
{
Assembly currentAssembly = Assembly.LoadFile(file.FullName);
foreach (Type type in GetTypesLoaded(currentAssembly))
{
if (type != typeof(EnginePluginBase))
continue;
EnginePluginBase plugin = (EnginePluginBase)Activator.CreateInstance(type);
plugins.Add(plugin);
}
}
return plugins;
}
private Type[] GetTypesLoaded(Assembly assembly)
{
Type[] types;
try
{
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types = e.Types.Where(t => t != null).ToArray();
}
return types;
}
vous pouvez le faire avec classe abstraite –
Il nous manque le code de GetTypesLoaded. Quoi qu'il en soit, ce 'si (type! = Typeof (EnginePluginBase))' semble incorrect: vous devriez trouver (je suppose) des types qui héritent de EnginePluginBase. Essayez d'utiliser 'IsAssignableFrom':' if (! Typeof (EnginePluginBase) .IsAssignableFrom (type)) ' –
@GianPaolo GetTypesLoaded est juste assembly.GetTypes() avec une vérification nulle. Je vais essayer votre suggestion. – ernest