Bonjour,
je me lance dans le C#.
J'ai un programme qui doit charger des DLLs. Ces DLLs implémentent l'interface PluginInterface.
Programme principal:
foreach (Type type in assembly.GetTypes())
{
if (type.IsSubclassOf(typeof(PluginInterface)) || type.Equals(typeof(PluginInterface))
|| type == typeof(PluginInterface) || type.IsInstanceOfType(typeof(PluginInterface))) // && !type.IsAbstract) if PluginInterface is not an Interface
{
Console.WriteLine("and this is a plugin");
pluginList.Add((PluginInterface) Activator.CreateInstance(type));
}
else
Console.WriteLine("but this is NOT a plugin ({0}) ({1})", type, typeof(PluginInterface));
}
La DLL:
public class Plugin : PluginInterface
{
....
}
Et en sortie:
Found /home/julien/Projects/depot/branches/jsobrier/platine/PluginInterface/validation/Plugin.dll
but this is NOT a plugin (PluginInterface) (PluginInterface)
but this is NOT a plugin (Plugin) (PluginInterface)
but this is NOT a plugin (Session) (PluginInterface)
Je comprends pas ce qui ne vas pas surtout quand je vois "(PluginInterface) (PluginInterface)"!
Et connaissez-vous des mailing list ou forums sur le langage C#/Mono?
Merci
# Type.GetInterfaces()
Posté par TazForEver . Évalué à 2.
using System.Reflection;
public class plugin
{
public static void Main(string[] args)
{
foreach(string path in args)
{
Assembly asm = Assembly.LoadFrom(path);
foreach(Type t in asm.GetTypes())
{
foreach(Type i in t.GetInterfaces())
{
if(i == typeof(System.Collections.ICollection))
{
Console.WriteLine(t);
break;
}
}
}
}
}
}
PS: désolé pour l'indentation de merde, ça fait des années qu'on réclame un balise tt qui fonctionne :o
[^] # Re: Type.GetInterfaces()
Posté par jusob . Évalué à 1.
Je pense que je dois remplacer cette ligne par:
if (i == typeof(PluginInterface))
Mais cela donne toujours fase:
Console.WriteLine("but this is NOT a plugin ({0}) ({1})", i, typeof(PluginInterface)) =>
but this is NOT a plugin (PluginInterface) (PluginInterface)
[^] # Re: Type.GetInterfaces()
Posté par TazForEver . Évalué à 1.
[^] # Re: Type.GetInterfaces()
Posté par jusob . Évalué à 1.
foreach (Type type in asm.GetTypes())
{
// we're interested in the interface
foreach(Type intrfce in type.GetInterfaces())
{
if (intrfce == typeof(PluginInterface))
{
Console.WriteLine("and this is a plugin");
pluginList.Add((PluginInterface) Activator.CreateInstance(type));
}
else
Console.WriteLine("but this is NOT a plugin ({0} != {1})", intrfce, typeof(PluginInterface));
}
}
[^] # Re: Type.GetInterfaces()
Posté par jusob . Évalué à 1.
Je me rends compte que c'est pas très malin: je veux créer une nouvelle instance d'une interface!!
Voilà ce que je voulais faire de façon plus générale:
j'ai un core qui charge des DLL fait par d'autres personnes. Je compte donc mettre à disposition une interface PluginInterface que chaque DLL devrait implémenter.
Mais je me rends compte que si je veux traiter chaque DLL en tant que PluginInterface, PluginInterface devrait être une classe putôt qu'une interface, non?
[^] # Re: Type.GetInterfaces()
Posté par TazForEver . Évalué à 1.
[^] # Re: Type.GetInterfaces()
Posté par TImaniac (site web personnel) . Évalué à 2.
Non non, tu demandes une instance de "type", qui dans ton code correspond au type concret d'un element, et pas une interface, donc ton morceau de code est tout à fait logique.
De manière générale tu te retrouveras de toute façon avec un problème récurrent : il faut appeler le constructeur du type concret, et là impossible d'être sûr qu'il y a un constructeur par défaut, une interface ne pouvant spécifier celà (ce qui est fort dommage).
Voici par ici le code que j'utilise dans un projet pour charger dynamiquement des plugins :
http://projet.ifsic.univ-rennes1.fr/cgi-bin/viewcvs.cgi/projet/src/(...)
celà marche nickel.
Tu remarqueras que je ne créé pas d'instance sur le tas (parcque j'ai besoin d'en faire pleins à d'autres moment), et que donc je me contente de mémoriser le Type trouvé dans une Hashtable.
Après le principe est exactement le même que ce que tu as proposé, à ceci prêt que j'utilise une classe abstraite (Module) plutôt qu'une interface, mais les 2 auraient été possibles.
Je pars aussi du principe que mes plugins prennent un argument particulier en constructeur (la classe abstraite réclamant un constructeur spécifique, à défaut de pouvoir l'imposer dans la classes fille le développeur va devoir se demander où trouver ce paramètre et lire la doc :) )
[^] # Re: Type.GetInterfaces()
Posté par jusob . Évalué à 1.
Je rebondis sur ton code: quel logiciel utilises-tu sous Linux pour extraire la donc de ton source code?
# quelques liens
Posté par TImaniac (site web personnel) . Évalué à 1.
http://www.dotnetguru.org/index.php?module=pnForum&func=viewfor(...) (les utilisateurs de ce site sont plutôt "qualifiés")
Sinon :
http://www.developpez.net/forums/viewforum.php?f=49(...) (mais bon apparement tu y en viens :) )
ou encore :
http://www.csharpfr.com/forum.v2.aspx(...)
Sinon, ben ici :)
Mailing-lists Mono :
http://www.go-mono.com/mailing-lists.html(...)
Autre mailing-lists plus générales et en ingliche :
http://discuss.develop.com/(...)
SInon pour ton problème de Reflection, comme dis au dessus, GetInterfaces est ton sauveur
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.