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

Bibliothèques C++ Discussion :

Utilisation d'une dll C# dans du code C++ ?


Sujet :

Bibliothèques C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Utilisation d'une dll C# dans du code C++ ?
    Bonsoir,

    J'ai un très gros problème, après plusieurs heures de recherches et de tests, je viens vous voir afin que nous trouvions une solution ensemble...

    Je possède une librairie COM faite en C# qui est utilisée par Excel pour effectuer plusieurs tâches.
    Je souhaite, en C++, pouvoir importer cette librairie afin de pouvoir utiliser ne serait-ce que le constructeur d'une des classes. IMPOSSIBLE. Il y a également plusieurs namespaces à prendre en compte dans cette librairie.

    J'ai essayé :
    - Activer le /CLR afin d'avoir du code managé
    - De faire un #import de la dll, un #import du tlb
    - De faire un using... Ajouter une référence....

    En faisant un #using de la dll, la compilation marche. Je fais également un using namespace qui va bien, ça compile. J'essaie alors d'instancier une de mes classe, je fais :

    => Ca ne marche pas, j'ai alors compris qu'il fallait remplacer '*' par '^'.

    => Ca compile ! Cependant l'objet est biensûr vide étant donné qu'il n'y a pas de new

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maClasse ^monPtr = gcnew maClasse();
    Ca ne veut pas fonctionner, le compilateur plante.. De même avec un simple new.

    Il aime pas mon TLB, plus de 180 erreurs de compilations (notamment le get_type qu'il n'aime pas, ainsi que des ; manquant soit disant...).

    Avez-vous des idées ?

    Je vous remercie d'avance pour l'intérêt que vous porterez à mon problème,

    Selven.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Peux-tu montrer comment tes interfaces COM-Visible sont définies dans la DLL C#?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Voici comment je procède :

    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
    33
    34
    35
    36
    37
    38
    39
     
    // Dans le header
    #import "MaDll.tlb" raw_interfaces_only
     
    // Utiliser ILDasm pour retrouver les noms
    using namespace LeNamespaceDeLaDll;
     
    // Déclaration de la variable (dans une classe par exemple)
    // Noter le I et Ptr
    LeNamespaceDeLaDll::ILeNamespaceDeLaDllPtr m_pMaVariable = NULL;
     
    // Initialisation
    try{
     
      // Noter le C
      LeNamespaceDeLaDll::ILeNamespaceDeLaDllPtr pTmpVariable(__uuidof(LeNamespaceDeLaDll::CLeNamespaceDeLaDll));
     
      m_pMaVariable = pTmpVariable;
     
      // Parce que AddRef();
      pTmpVariable = NULL;
    }
    catch(...){
     
      // C'est juste le côté programmation défensive
      if(m_pMaVariable){
        m_pMaVariable = NULL;
    }
     
    // Utilisation
    try{
     
      if(m_pMaVariable != NULL)
        m_pMaVariable->CallFunctionQuiVaBien();
     
    catch(...){
     
      LogError();
    }
    C'est pour du C++ natif. Pour du C++/CLI, c'est différent.

    PS: Intellisense s'en sort pas trop mal en général.

Discussions similaires

  1. [MEX] utiliser une dll C dans le code matlab
    Par hector2 dans le forum MATLAB
    Réponses: 2
    Dernier message: 18/06/2010, 15h53
  2. Réponses: 4
    Dernier message: 03/03/2010, 09h08
  3. utilisation d'une fonction ailleur dans le code
    Par tortuegenie dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/11/2008, 11h07
  4. Utilisation d'une Dll c# dans un projet c,c++
    Par hunter69fr2002 dans le forum C#
    Réponses: 2
    Dernier message: 07/02/2008, 16h20
  5. Réponses: 7
    Dernier message: 05/01/2008, 19h37

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