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 :

Interface et déclarations d'objets et énumérations


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut Interface et déclarations d'objets et énumérations
    Bonsoir à tous,
    je vous soumet mon problème.
    Je dois développer une application dans laquelle je dois pouvoir activer des modules optionnels/plugins.
    Je cherche une technique pour y arriver.

    Actuellement, j'essaye en créant des interfaces par modules/plugins :
    mon programme fait référence à une dll contenant des interfaces.
    Mes modules/plugins font aussi référence à la dll contenant ces interfaces.
    Par réflexion, je cherche les dll modules/plugins présentes dans un dossier et j'active les boutons ...

    Cela fonctionne bien pour des méthodes simples, mais je butte sur plusieurs problèmes :

    - par exemple, une de mes classes modules/plugins dérive d'un PictureBox.
    Comment déclarer dans l'interface la méthode renvoyant cet objet dérivant de "pictureBox".
    En effet l'intefarce ne voit pas cet objet car elle ne pas fait pas référence à la dll module/plugin.

    - j'ai le même problème avec une énumération qui se situe dans la classe optionnelle et doit être utilisée
    dans MonProg

    Voilà, si quelqu'un pouvait m'aider ...

    De plus, mais s'il y a une meilleure solution je suis preneur pour gérer des plugins/options...

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par Tomcat31 Voir le message
    - par exemple, une de mes classes modules/plugins dérive d'un PictureBox.
    Ce n'est pas un plugin mais un contrôle à ce moment. Ca ne résoud pas ton problème, mais ça me semble bizarre comme plugin.

    Citation Envoyé par Tomcat31 Voir le message
    - j'ai le même problème avec une énumération qui se situe dans la classe optionnelle et doit être utilisée dans MonProg.
    Déclare l'énumération dans la DLL qui contient les interfaces.

    Citation Envoyé par Tomcat31 Voir le message
    De plus, mais s'il y a une meilleure solution je suis preneur pour gérer des plugins/options...
    Je n'ai pas eu l'occassion de tester, mais le framework MEF (Managed Extensibility Framework) est une piste à explorer : http://laedit.developpez.com/CSharp/...ramming_Guide/

  3. #3
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut
    Bonjour à tous,
    merci StormimOn pour ton aide.

    Ce n'est pas un plugin mais un contrôle à ce moment
    Oui effectivement il y a un contôle personnalisé dans cette dll.

    mais ça me semble bizarre comme plugin
    J'explique rapidement.
    Mon programme permet, entre autre, de fusionner des étiquettes images (mon contrôle perso) sur une image principale. Cette partie permet de faire l'agencement graphique et de prévisualiser.
    Si la dll n'est pas présente, je ne doit pas avoir cette fonctionnalité.

    Je vais lire ta doc.
    Néanmoins, concernant le problème initial, est-ce que c'est quelque chose d'impossible ? J'aimerais bien avoir une explication, s'il vous plait.

    Cordialement.

  4. #4
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Tu parle du problème de la PictureBox ?
    Je comprends pas ce qui té dérange

    Vu que ca hérite de pictureBox, tu peux très bien retourner un pictureBox, et l'utiliser après, grace un cast, comme ta classe qui est dans ta dll...

    Ou alors j'ai rien compris ? c'est possible aussi

  5. #5
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut
    Merci cs_ntd pour ton aide.

    J'ai effectivement un contrôle perso qui hérite de PictureBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class MonObjet :  PictureBox
    {
      ...
    }
    et dans une autre classe qui gère mon objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class toto : Itoto
    {
      MonObjet AddImage()
      {
         MonObjet obj;
         ...
         return obj;
      }
    }
    Cet exemple de code fait partie de ma dll module/plugin, ok ?
    Cette classe implémente l'interface IToto.
    Pour que mon programme ne "plante" pas à l'exécution si la dll contenant ces objets n'est pas présente, mon programme fait référence à l'interface IToto, plutôt qu'à ma dll.

    Comment puis-je déclarer par exemple "MonObjet AddImage()" dans l'interface alors que l'interface ne connait pas le contenu de ma dll module/plugin ? J'ai des erreurs comme quoi "MonObjet" n'est pas connu.

    Je me suis peut être trompé de méthode (je l'ai trouvé en recherchant un peu partout) mais j'arrive pas...

    Je vais regarder ce que StormimOn m'a proposé, mais j'aimerais vraiment savoir si c'est impossible histoire aussi de bien comprendre et de m'améliorer...

    Cordialement.

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    Ayant réaliser un logiciel entièrement basé sur les plug-in, voici quelques conseils que je peux te fournir...

    1 - Avoir une liste de plug-in à charger (éventuellement, tu peux avoir un outil automatique qui te fait cette liste)

    2 - Quand tu charges un plug-in, tu peux chercher par reflexion si il implémente l'interface attendu. Si c'est le cas, tu peux créer une instance de la classe implémentant cette interface, sinon, tu rejettes le plug-in.

    3 - Le fait d'avoir une liste pour les plug-in permet d'éviter de charger toutes les DLL d'un repertoire et donc, de se retrouver avec plusieurs chargement d'une meme DLL dans le meme domaine d'application. Ce phénomène est très génant car il empeche ensuite d'éventuel affectation car pour .Net, chargé 2 fois la même DLL (une fois car référencé par le module Host, et une fois dynamiquement) lui amène à voir les 2 DLL comme 2 DLL Différentes...

    4 - J'ai regarde le MEF mais je trouve cela trop "pesant" par rapport à l'implémentation d'un système perso très facile à faire, rapide...

    Voilà. Mes conseils valent ce qu'ils valent, mais pour moi, je n'y ai trouvé que des avantages (maitrise total du code, du mécanisme, des interfaces, etc...)

  7. #7
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Citation Envoyé par Tomcat31 Voir le message
    Comment puis-je déclarer par exemple "MonObjet AddImage()" dans l'interface alors que l'interface ne connait pas le contenu de ma dll module/plugin ? J'ai des erreurs comme quoi "MonObjet" n'est pas connu.

    Tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class toto : Itoto
    {
      PictureBox AddImage()
      {
         MonObjet obj;
         ...
         return obj;
      }
    }

    Comme ca, dans l'interface tu déclare PicureBox AddImage();
    Après, quand tu utilisera AddImage, tu pourra très bien faire MonObjet truc = (MonObjet)AddImage();

  8. #8
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut
    Merci cs_ntd.

    Ne voyez pas de la mauvaise volonté, mais ...

    MonProg -- utilise --> IToto <-- implémente -- Mon plugin

    MonProg fait référence à l'interface pour l'utiliser et mon module/plugin fait référence à l'interface pour l'implémenter :

    comment dans MonProg je peux caster mes objets avec MonObjet s'il n'est pas connu de MonProg ?

    Cordialement.

  9. #9
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Tomcat31 Voir le message
    Merci cs_ntd.

    Ne voyez pas de la mauvaise volonté, mais ...

    MonProg -- utilise --> IToto <-- implémente -- Mon plugin

    MonProg fait référence à l'interface pour l'utiliser et mon module/plugin fait référence à l'interface pour l'implémenter :

    comment dans MonProg je peux caster mes objets avec MonObjet s'il n'est pas connu de MonProg ?

    Cordialement.
    Je confirme que ca n'est pas possible. Ca induierait une dependance!

  10. #10
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    A oui c'est pas possible (EDIT: de caster dans le programme principal) !

    Si tu a besoin de faire ça, c'est une erreur de coneption. Ton plugin est là pour rajouter un comportement particulier pour une pictureBox, qui peut être plus ou moins dirigé grâce a ton interface.

    Mais si tu a besoin d'utiliser ces pictureBox particulières dans ton programme, cela n'a aucun sens de les mettre en plugin !

    Ca ne t'empeche pas d'utiliser ces pictures box particulières, mais tu ne peux utiliser que la partie 'PictureBox' dans ton programme principal. Les traitements qui ont besoins des attributs / méthodes de "MonObjet" spécifiquement ( et donc, tout ce qui nécessite un cast vers MonObjet) doivent se trouver dans la DLL du plugin.

    Pour être plus précis, si tu garde ma définition de la AddImage(), tu peux très bien, dans ton programme principal, faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PictureBoc p = AddImage();
    p.Location = new Point(10,20);
    puisque ça n'utilise que les propriétés d'une pictureBox normale.

    Maintenant, supposons que ta classe MonObjet soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MonObjet :  PictureBox
    {
      public int nombre;
      ...
    }
    Tu ne pourras utiliser MonObjet.nombre QUE dans le plugin.
    Et dans le code du plugin tu pourra très bien faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonObjet mo = (MonObjet)AddImage();
    mo.Location = new Point(10,20);
    mo.nombre = 5;
    Mais si tu as besoin de faire ça dans ton programme principal, c'est qu'il y a un problème de conception, et cette classe devrait se trouver dans le programme principal.

    J'espère avoir été compréhensible, il est tard

  11. #11
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut
    Franchement merci de m'avoir confirmé ce que commençais à voir venir de loin...

    Je vais donc changer mon fusil d'épaule.
    Je vais mettre mes contrôles perso dans une dll que mon programme référencera.
    Par contre je mettrai dans les dll via des interfaces les "clés" qui permettront d'utiliser ces contrôles.

    Cordialement.

    Tomcat31

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

Discussions similaires

  1. Sessions avant ou après déclaration des objets PHP
    Par tchoukapi dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2008, 23h38
  2. Interface graphique "statique" ou "objet" ?
    Par agent007se dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 22/01/2007, 01h16
  3. pb de déclaration d'objet dans vba
    Par bbgprog dans le forum Access
    Réponses: 10
    Dernier message: 01/08/2006, 14h03
  4. interface : multi surface et objet
    Par DEVfan dans le forum SDL
    Réponses: 1
    Dernier message: 31/07/2006, 22h33
  5. [Convention]déclarations des objets
    Par allstar dans le forum Langage
    Réponses: 4
    Dernier message: 17/11/2005, 00h57

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