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 :

Faut-il passer par un wrapper?


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Points : 49
    Points
    49
    Par défaut Faut-il passer par un wrapper?
    Salut!
    Voila, je dois mener a bien un projet d'étude, dans lequel une librairie (VRPN) gérant des dispositifs virtuels est utilisée. Cette librairie est en C++ et je pensais réaliser mon projet en C# (c'est pour du OgreDotNet).
    J'ai pu au fil des tutoriaux ogre comprendre que le code C++ de Ogre était wrappé grace a Sygwin. Pour ce qui est de ogre, pas de probleme puisque les .i sont fourni dans le pack OgreDotNet.
    Mais pour ma librairie VPRN, comment je peux m'y prendre pour que ca ne soit pas trop laborieux. Et est-ce que je devrais plutot me remettre au C++ (j'avais choisi C# pour créer une belle interface graphique )?...
    Merci!

  2. #2
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    perso je créerai l'IHM en C# et je ferai un wrapper pour interfacer l'IHM avec la librairie.

    Bye

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Points : 49
    Points
    49
    Par défaut
    salut! merci pour ta réponse!
    Oui il existe des dll de cette librairie. Mais je peux les utiliser indépendamment de leur langage d'origine?
    Les .dll sont en langage machine je crois me rappeller, et donc ca devrait etre pas un probleme pour les utiliser avec n'importe quel langage? Dite moi si je raconte n'importe quoi...
    donc du coup je peux les utiliser pour mon projet en C# bien qu'elles aient été compilée à partir de C++...?

    Bon j'essai de mettre en reference mon dll, mais il me dit qu'il ne peux pas l'ajouter. "Assurez-vous que le fichier est accessible et qu'il s'agit d'un assembly valide ou d'un composant COM".

  4. #4
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    oui oui tu ne dis pas de bêtises. Ta dll est indépendante du langage puisque c'est du compilé.
    Normal que tu ne puisses pas ajouter ta dll dans les références parce que comme te le dit le message, tu peux que référencer des composants COM, ou des assembly .NET.
    Si tu souhaites utiliser ta dll, tu dois utiliser P/Invoke.

    Utilisez-Pinvoke

    Bye

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Points : 49
    Points
    49
    Par défaut
    merci Pilloutou!! m'en vais essayer tout ça!

  6. #6
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Alors, qu'est ce que ça donne ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Points : 49
    Points
    49
    Par défaut
    Salut!
    Bon j'ai tardé à répondre car j'ai du passer beaucoup de temps sur une autre partie du projet...
    Alors j'ai pu importer ma dll:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DllImport("vrpndll.dll")]
    en ajoutant une directive de using (voir site MSDN):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Runtime.InteropServices;
    le probleme c'est que je n'ai pas accès aux classe de ma lib vrpndll...
    En tentant d'instancier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vrpn_Analog_Remote analog
    par exemple, il me dit
    Erreur 1 Le type ou le nom d'espace de noms 'vrpn_Analog_Remote' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)
    Quelqu'un a une idée?

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    http://morpheus.developpez.com/dlldotnet/

    Il faut que tu penses à déclarer le "Wrapper" de ta fonction, dans ton code C#

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Points : 49
    Points
    49
    Par défaut
    Merci Thomas pour ta réponse, et pour cet article bien écrit!
    Donc si j'ai bien compris, le Wrapper de ma fonction contient seulement le nom de la fonction, et dans le corps se trouve les arguments, c'est bien ça?
    Encore une question: comment ça se passe pour wrapper une classe?

  10. #10
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Regarde ce tuto : http://badger.developpez.com/tutorie...t-glass-vista/

    Il y a des exemples de wrappers pour une dll native Vista. Et surtout à la fin il y a des liens vers des articles MSDN sur les wrappers.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Points : 49
    Points
    49
    Par défaut
    Salut!
    Merci pour ta réponse the_badger_man
    Bon j'ai essayé de wrapper une des classe de ma lib mais c'est pas gagné, j'ai plein d'erreur....
    Voila ma classe en C++, c'est:
    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
    class VRPN_API vrpn_Analog_Remote: public vrpn_Analog {
        public:
            vrpn_Analog_Remote (const char * name, vrpn_Connection * c = NULL );
     
            virtual void mainloop();
     
            virtual int register_change_handler(void *userdata,
    		vrpn_ANALOGCHANGEHANDLER handler) {
    	  return d_callback_list.register_handler(userdata, handler);
    	};
            virtual int unregister_change_handler(void *userdata,
    		vrpn_ANALOGCHANGEHANDLER handler) {
    	  return d_callback_list.unregister_handler(userdata, handler);
    	}
     
        protected:
            vrpn_Callback_List<vrpn_ANALOGCB> d_callback_list;
     
            static int VRPN_CALLBACK handle_change_message(void *userdata, vrpn_HANDLERPARAM p);
    };
    j'ai tenté de wrapper ça comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            [DllImport("vrpndll.dll")]
            extern class  vrpn_Analog_Remote:  vrpn_Analog {
        public vrpn_Analog_Remote (char name, vrpn_Connection c = null );
     
        public   virtual void mainloop();
     
          public  virtual int register_change_handler( userdata,
    		vrpn_ANALOGCHANGEHANDLER handler) {
    	  return d_callback_list.register_handler(userdata, handler);
    	};
            virtual int unregister_change_handler( userdata,
    		vrpn_ANALOGCHANGEHANDLER handler) {
    	  return d_callback_list.unregister_handler(userdata, handler);
    	}
    mais bon apparement c'est pas ça!...

    bon peut etre quelqu'un pourrait-il me donner la correction?
    merci!

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 85
    Points : 49
    Points
    49
    Par défaut
    up!

Discussions similaires

  1. Faut-il passer par la création d'un module ou pas
    Par taka10 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 08/12/2012, 20h19
  2. xml et base de donnée : faut-il passer obligatoirement par XML
    Par monphp dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 25/04/2007, 01h41
  3. [Modèles des Flux] Faut-il nécessairement passer par un MCD?
    Par CrEtiN- dans le forum Merise
    Réponses: 13
    Dernier message: 25/05/2005, 16h49
  4. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13
  5. [Kylix] Débrider Kylix sans passer par le Net
    Par BXDSPORT dans le forum EDI
    Réponses: 1
    Dernier message: 23/03/2003, 10h52

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