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:
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 !
}
Et oui: 'IsAssignableFrom', 'as', 'is', '==' et 'GetGenericTypeDefinition': toutes ces solutions me renvoient un false quand je vérifie si ça match...


Seconde blague (pour laquelle je cherche une alternative):

Quand j'en ai trouvé un, je veux l'instancier:
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);
J'avais commencé par la version courte avec les cast direct, mais ça marche pas (pas plus que cette version).
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
public class Travailleur : IWorker
Je me doute que j'ai zappé une étape, mais je vois pas où...

Toute aide ou remarque (même délirante) est la bienvenue !

Merci d'avance