2009-01-17 8 views
3

Les réponses que j'ai à this question ont résolu le problème que j'avais dans cette question, mais je me demande s'il est possible de l'étendre un peu. Par exemple, si des tierces parties apportaient des commandes à ce système, y aurait-il un moyen d'étendre la première réponse à ma question précédente pour lui permettre de charger toutes les commandes de toutes les DLL dans un dossier, puis de les lister dans la zone de liste.Polymorphisme C# - charger des classes à partir de fichiers DLL

Est-ce possible? Serait-il capable de travailler avec une liste d'ICommand (comme la réponse à ma question précédente a suggéré).

Répondre

5

Oui.

Assembly commandAssembly = Assembly.Load("some/path") 
var commands = new List<ICommand>(); 

foreach (Type type in commandAssembly.GetTypes()) 
{ 
    if (type.GetInterface(typeof(ICommand).FullName) != null) 
    { 
     commands.Add((ICommand)Activator.CreateInstance(type)); 
    } 
} 

Toutefois, vous rencontrerez probablement certaines restrictions concernant le chargement de l'ensemble. Vous ne pouvez pas charger des assemblys de n'importe où, sinon vous pourriez réimplémenter quelque chose comme COM DLL enfer.

+0

La meilleure pratique pour ce type de chargement serait de charger uniquement les assemblages dans un sous-répertoire. –

1

Vous pouvez charger chaque assembly dans un répertoire, parcourir chaque classe exposée dans l'assembly, puis vérifier l'implémentation de votre ICommand. De là, vous pouvez ensuite les ajouter à votre système interne en créant une nouvelle instance de ces objets.

Certains endroits pour la vérification des erreurs:

  • charge de montage, assurez-vous qu'il est CLR.
  • Construction: assurez-vous qu'il ne nécessite aucun paramètre et qu'il a un constructeur public.
  • Construction: assurez-vous que ce n'est pas une classe abstraite.
Questions connexes