Bonjour,
Je travaille sur un projet qui doit pouvoir loader des assembly (Workers) à la demande dans un repertoire.
La solution du serveur contient un projet "WorkerInterface" qui contient seulement la déclaration de mon Interface IWorker.
J'ai aussi un projet A dont la classe Travailleur implemente IWorker.
Mon serveur parcours un repertoire à la recherche d'assemblies, récupère leurs types et vérifie qu'ils implémentent l'interface voulue.
Si c'est le cas, on l'instancie pour le faire travailler.
Première blague (pour laquelle je cherche une explication):
Après recherche sur internet, vérifier qu'une assembly implemente une interface, c'est assez simple:
Et oui: 'IsAssignableFrom', 'as', 'is', '==' et 'GetGenericTypeDefinition': toutes ces solutions me renvoient un false quand je vérifie si ça match...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Assembly assembly = Assembly.LoadFrom(assemblyPath); foreach (Type loadedType in assembly.GetTypes()) { Type interf = loadedType.GetInterface(typeof(IWorker).FullName); if (interf != null) // On en a trouvé un ! }
Seconde blague (pour laquelle je cherche une alternative):
Quand j'en ai trouvé un, je veux l'instancier:
J'avais commencé par la version courte avec les cast direct, mais ça marche pas (pas plus que cette version).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 object newWorker = Activator.CreateInstance(loadedType); IWorker worker = newWorker as IWorker; if (worker != null) mWorkers.Add(worker);
Mais je ne comprends pas pourquoi !
Quand je passe dans ce code en pas à pas, l'object retourné par le CreateInstance présente bien mes méthodes de IWorker,
mais il refuse de le caster à la ligne du dessous.
je suis pourtant pas fou:
Je me doute que j'ai zappé une étape, mais je vois pas où...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 public class Travailleur : IWorker
Toute aide ou remarque (même délirante) est la bienvenue !
Merci d'avance
Partager