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++/CLI Discussion :

[C#] Comment appeler un objet C++ ?


Sujet :

C++/CLI

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 38
    Points : 32
    Points
    32
    Par défaut [C#] Comment appeler un objet C++ ?
    Bonjour,

    Je ne connais pas trop le c#, j'ai un composant dll (non com) fournit par un client. Dans mon programme c# j'utilise DllImport etc ..., j'arrive à appeller les focntion static de la dll sans problème.

    Mon soucis est que dans cette dll il a des objet qu'il faut instancier ex :

    En C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    MaClasse *class = new MaClasse(const char *  ODBCName =          DEFAULT_ODBC,  
      const char *  LoginName = USERNAME,  
      const char *  Password = "" );
     
    class->maMethode();
    Et je ne sais pas comment faire en C#.

    merci pour votre aide.

    xarius.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    La réponse est simple : ce n'est pas possible.

    Les dll sont conçues pour exporter des fonctions C.
    Le passage de classes par une interface de dll est une extension non standard spécifique aux compilateurs.
    On ne peut pas faire boire un âne qui n'a pas soif.

  3. #3
    Expert éminent
    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
    Points : 8 344
    Points
    8 344
    Par défaut
    donc tu veux pouvoir Marshaller une classe depuis le C++ vers le C# c'est bien ça ?
    C'est pas vraiment impossible, puisque COM le fait donc en gros :
    soit tu fait une bibliothèque COM
    soit ... pour le 2è point je n'ai pas trouvé la réponse ( pour l'instant )
    par contre je me souvient que c'était possible avec Delphi donc il doit bien y avoir un moyen en passant par des pointeurs de classes ...

    edit:
    Quand j'y pense, si tu as Visual C++.Net tu pourrais aussi passer par une classe __gc et une assembly en Mixed Mode ( C++ CLI ou Managed et C++ Natif )

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Si on change les données de base de la question, il est peut être possible de faire un wrapper .net pour cette dll en utilisant Visual C++ .net.
    A condition que cette dll provienne d'un compilateur Microsoft et pas Borland ou autre.
    On ne peut pas faire boire un âne qui n'a pas soif.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    donc tu veux pouvoir Marshaller une classe depuis le C++ vers le C# c'est bien ça ?
    Oui mais je ne sais pas trop comment faire.



    Si on change les données de base de la question, il est peut être possible de faire un wrapper .net pour cette dll en utilisant Visual C++ .net.
    A condition que cette dll provienne d'un compilateur Microsoft et pas Borland ou autre.
    Oui la dll vient d'un compilo Microsoft

    Mais c'est pareil je ne sais pas trop comment faire.

    Auriez vous des bouts de codes ?

  6. #6
    Expert éminent
    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
    Points : 8 344
    Points
    8 344
    Par défaut
    En gros voilà, si tu sais charger ta classe à partir du C++ vers le C++ ( ), tu peut écrire un wrapper comme décrit ici :
    http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vcmex/html/vcgrfmanagedwrappersaroundunmanagedtypes.asp
    en gros ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    __gc public class managed ...
    {
      nativeclass * qqch;
      managed(params ...)
      {
        qqch = new qqch(params ...);
      }
    }
    Dans ce cas il faut donc convertir tout les appells à la classe et les faire passer par ta classe managée. Une fois que celà est fait tu pourras accéder directement à la classe tel quel ( à travers la class __gc ) depuis ton programme C#, et ça c'est bien

    Sinon il faut passer par du Custom Marshalling et là ça devient vite très costaux
    http://www.codeguru.com/columns/kate/article.php/c4867/
    http://www.codeguru.com/columns/kate/article.php/c4865/

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Ok, merci pour votre aide, je vais essayer ce code, et je vous tiens au courant.

    Merci.

    @ xarius

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Petite question tout de même, je ne possède pas les sources de ma dll, juste la doc, me disant ce qu'il faut instancier et les fonctions à appeller.

    Aussi pour faire du code manager faut il les sources de la dll ou pas ?

    Cordialement,

    @+ xarius

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Non, pas besoin des sources.

    L'idée est d'utiliser Visual C++ .Net pour accéder à la DLL et créer des objets non managée, bref , utiliser cette Dll comme elle a été conçue pour l'être.

    Pour faire le lien avec C#, il faut créer en C++ .net un assembly (type bibliothèque de classe) qui expose une classe publique managée qui fait le lien avec les objets non managés. C'est une classe enveloppe (wraper).
    On ne peut pas faire boire un âne qui n'a pas soif.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    690
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2005
    Messages : 690
    Points : 1 647
    Points
    1 647
    Par défaut
    Bonjour,

    tout d'abord désolé de déterrer ce topic assez ancien, mais j'aimerais faire exactement la même chose que Xarius, sauf que je possède le code source c++ de ma lib
    ma lib se compose d'un fichier .dsw à la racine, et dans chaque répertoire il y a un fichier .dsp

    si je fait un click droit sur ma solution puis ajouter -> projet existant (je choisi alors mon .dsp) et bien il me le rajoute bien à ma solution, par contre je ne peut pas ajouter ce nouveau projet dans les réferences de mon prog c# car j'ai un message d'erreur : une réference à "malib" ne peut pas etre ajoutée

    est-ce que quelqu'un peut m'éclairer svp ?

    merci d'avance

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    ce n'est pas une référence qu'il faut utiliser car ce n'est pas une assembly, plutot un dllimport, voir http://nico-pyright.developpez.com/t...c2005/interop/

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    690
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2005
    Messages : 690
    Points : 1 647
    Points
    1 647
    Par défaut
    merci, ton lien est tres interressant effectivement

    je sais comment utiliser dllimport, mais là c'est pour utiliser des classes (pas juste des fonctions)
    mais c'est quand même vachement compliqué...

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

Discussions similaires

  1. [FAQ] Comment appeler un objet dans une page ?
    Par SylvainPV dans le forum Contributions JavaScript / AJAX
    Réponses: 0
    Dernier message: 18/10/2014, 17h25
  2. Comment utiliser une variable pour appeler un objet ?
    Par kikou63 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/10/2010, 17h54
  3. Réponses: 3
    Dernier message: 25/06/2008, 14h38
  4. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 17h34

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