Forum Programmation.c# Problème avec IsSubclassOf

Posté par  .
Étiquettes : aucune
0
5
fév.
2005
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  . Évalué à 2.

    using System;
    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  . Évalué à 1.

      Merci pour le code

      if(i == typeof(System.Collections.ICollection))


      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  . Évalué à 1.

        tu as bien utilisé GetInterfaces() ?
        • [^] # Re: Type.GetInterfaces()

          Posté par  . Évalué à 1.

          // check if this dll inherits PluginInterface
          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  . Évalué à 1.

            pluginList.Add((PluginInterface) Activator.CreateInstance(type));


            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  . Évalué à 1.

              ben si tu veux instancier, il te faut une classe certes, avec soit un constructeur, soit une méthode factory
            • [^] # Re: Type.GetInterfaces()

              Posté par  (site web personnel) . Évalué à 2.

              Je me rends compte que c'est pas très malin: je veux créer une nouvelle instance d'une interface!!
              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  . Évalué à 1.

                Merci. J'ai finalement réussi à (presque!) régler mon problème.

                Je rebondis sur ton code: quel logiciel utilises-tu sous Linux pour extraire la donc de ton source code?
  • # quelques liens

    Posté par  (site web personnel) . Évalué à 1.

    Forum :
    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.