IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

plugins et reflexion


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut plugins et reflexion
    Bonjour,
    d'abord je précise que je suis débutant en C#.
    voila mon problème, je développe une appli (server, pas d'ihm) qui ne va servir d'hote à l'éxécution de plugins. C'est plugin étant des classes fournit dans une .dll (class library). Au démarrage du serveur j'aimerai listé les classes présentes dans la lib, verifier qu'elle implémente l'interface adéquate les instancier et leur demander de s'enregistrer auprès des services du serveurs dont elles auront besoin. N'étant pas très famillier des DLLs c'est l'étape du listing et de la verification d'interface qui me pose problème.
    Il y a-t-il des mécanisme particulièrement adapté à cela en C# ?
    Est-ce que la reflexion est une bonne idée ?
    N'est-ce pas un peu compliqué à mettre en oeuvre pour un débuttant ?
    merci par avance pour vos réponses.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    Ton idée est la bonne, le principe pour une appli .net gérant des plugin étant:
    1 - créer une assembly qui définit une interface que les plugin devront implémenter et que l'application hôte référence
    2 - créer l'application hôte qui devra localiser d'une manière ou d'une autre les assembly à charger, lister tous les types de ces assembly, vérifier s'ils implémentent l'interface de plugin, si oui les utiliser

    L'étape 2 c'est typiquement de la réflexion.

    En ce qui concerne la complexité: le scénario basique décrit plus haut est somme toute assez simple mais introduit des notions de .net pas évidentes. Cela dit l'exercice est intéressant et si tu es motivé tu devrais en venir à bout.
    Par contre une appli serveur a en général des contraintes de performance, de robustesse et de sécurité assez élevées, et créer une appli hôte qui gère des plugin "sérieuse" peut s'avérer une tâche trés ardue.

    Un lien qui devrait t'aider : http://msdn.microsoft.com/msdnmag/is...s/default.aspx

  3. #3
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    merci pour ta réponse.
    En ce qui concerne le sérieu de la mise en oeuvre on verra, mais mon périmètre est plus limité que ce que tu proposes. 1) il n'y aura qu'une assembly contenant les plugins. 2) les plugin seront développer par moi ou les collègues de l'équipe.
    Quand au contraintes des serveurs, j'en suis bien conscient ça fait 7 ans que j'en développe en C++.
    Qu'elles sont les notions dont tu parles autre que la reflexion ?

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    http://drq.developpez.com/dotnet/articles/plugin/
    ...
    La seule différene c'est qu'il va falloir tester les types retournés par GetTypes() avec quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(typeof(IMyPlugin).IsAssignableFrom(type_reçu_de_Assembly_GetTypes()))
    {
      ...
    }

  5. #5
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    merci smyley cet article m'avait echappée

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 324
    Par défaut
    Extrait d un bout de code de notre application qui charge des fichiers plugins au démarrage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    foreach (FileInfo fi in list)
                        {
                            //  for all DLL-files
                            if (fi.Extension.ToLower().Equals(".dll"))
                            {
                                assembly = Assembly.LoadFile(fi.FullName);
                                Type[] types = assembly.GetTypes();
     
                                foreach (Type typ in types)
                                {
                                    //  for all classes, which implements interface IPlugin
                                    if (typ.IsClass && typ.GetInterface("API.Plugin.IPlugin") != null)
                                    {
                                        try
                                        {
                                            obj = Activator.CreateInstance(typ);
                                            mi = typ.GetMethod("Init");
                                            mi.Invoke(obj, null);
                                            mi = typ.GetMethod("DisplayName");
                                            menuName = (string)mi.Invoke(obj, null);
                                            pluginList.Add(new PluginInfo(menuName, typ));
                                            MenuButtonItem mb = new MenuButtonItem(menuName, new System.EventHandler(generalPlugin_Activate));
                                            menuBarItemP.Items.Add(mb);
                                            ((IDisposable)obj).Dispose();
                                        }
                                        catch
                                        {
                                        }
                                    }
                                }
                            }
                        }
    Si cela peut te donner des idéss...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Citation Envoyé par BigNic
    merci pour ta réponse.
    En ce qui concerne le sérieu de la mise en oeuvre on verra, mais mon périmètre est plus limité que ce que tu proposes. 1) il n'y aura qu'une assembly contenant les plugins. 2) les plugin seront développer par moi ou les collègues de l'équipe.
    Quand au contraintes des serveurs, j'en suis bien conscient ça fait 7 ans que j'en développe en C++.
    Qu'elles sont les notions dont tu parles autre que la reflexion ?
    Bah si tu développes des applis serveurs en C++ depuis 7 ans je vois mal quels problèmes sérieux tu pourrais rencontrer en .net pour peu que tu saches lire les docs .
    Pour les autres notions, il y a les appDomain si par exemple tu souhaites pouvoir décharger tes plugin, le binding d'assembly en fonction d'où se trouvent les assembly que tu vas charger dynamiquement, le CAS pour la sécurité. Mais si ton scénario est trés simple tu n'auras pas besoin de tout ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Invoquer une méthode par reflexion en utilsant un plugin
    Par tounsi.ichraf dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 31/03/2014, 11h39
  2. Plugin MySQL
    Par Super Castor dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 30/08/2006, 02h54
  3. [plugin] XML/XSL
    Par cyrdec dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/04/2003, 17h50
  4. plugin winamp
    Par darkfrag dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 03/08/2002, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo