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 :

Intéropérabilité d'une bibliothèque C avec du C#


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Intéropérabilité d'une bibliothèque C avec du C#
    Bonjour tout le monde,

    J'essaye de générer une dll C++ et de l'utiliser dans un programme c#. Lors de l'ajour de la dll dans le programme C# une erreur que vous la trouver sur la première image attaché.

    Ensuite j'ai essayer d'utiliser la dll comme c'est mentionnée dans le point 3.3 du tutoriel sur le lien : http://nico-pyright.developpez.com/t...c2005/interop/ et j'ai eu l'erreur suivante que j'ai pa spû résoudre. (vous trouvez une image qui illustre cette erreur : 2ème fichier attaché)

    Est ce que quelqu'un a une idée sur l'origine de l'un de ces deux problèmes et/ou comment le résoudre ??

    Merci beaucoup d'avance
    Images attachées Images attachées   

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Je ne connais rien à C#, mais à mon avis la raison est la même dans les deux cas: il manque un manifeste à la DLL pour une raison ou une autre, ou alors elle n'est pas déployée correctement assembly). Du coup son chargement échoue, et vlan!
    À mon avis tu ferais mieux de faire transférer ce post en forum dédié C# ou C++/CLI, car c'est plutôt côté C# ou CLI que côté C++ que le problème (ou sa solution) se trouve.
    Packager une DLL pour qu'elle soit managée n'est peut-être pas identique à ce qu'exige ou tolère le C++ pur.

  3. #3
    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 519
    Points
    41 519
    Par défaut
    BadImageFormatException, c'est généralement un conflit entre 32 bits et 64 bits.
    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.

  4. #4
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup pour vos réponses

    Médinoc auriez-vous une idée comment corrigé le conflit entre 32 bits et 64 bits ??

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Passer la partie 32 bits en 64, ou l'inverse?

  6. #6
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Normalement je travaille avec la plateforme x86 donc 32 bits

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Comment as-tu récupéré ta DLL? C'est probablement elle qui est en 64, et que tu devrais chercher à remplacer par sa version 32bits

  8. #8
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    La DLL c'est moi qui le créer. J'ai créer un nouveau projet qui me génére la DLL puis je l'utilise dans le programme C#

  9. #9
    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 519
    Points
    41 519
    Par défaut
    Si tu es sur un Windows 64 bits, ton programme C# se lancera en 64 bits par défaut.
    Tu peux overrider ça dans les propriétés du projet, le forcer a utiliser la plate-forme x86.

    Pareil pour la DLL C++, tu peux choisir sa bitness dans les options du projet (seule une DLL C++/CLI compilée en /clr:safe sera indépendante de la machine comme une 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.

  10. #10
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Oui en effet je suis sur windows 64 bits et voici les options de mes projets :

    1. Projet C++ pour générer la DLL :
      • C/C++ -> Génération de code -> Bibliotheque Runtime = DLL multithread (/MD)
      • Editeur de liens -> Avancé -> Ordinateur cible = MachineX86(/MACHINE:X86)
    2. Projet C# :
      • Propriétés -> Générer -> Plateforme = (x86) active
      • Propriétés -> Générer -> Général -> Plateforme cible = x86


    Normalement avec ces configurations des deux projets ils sont tous les deux en 32 bits ou je me trompe ??

    parce que avec ces configurations ça fonctionne pas..

  11. #11
    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 519
    Points
    41 519
    Par défaut
    En effet, réglé ainsi ça devrait marcher...
    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.

  12. #12
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Justement j'ai cette configuration et ça me génére quand même l'erreur :

  13. #13
    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 519
    Points
    41 519
    Par défaut
    Tu n'es pas censé l'ajouter en tant que référence d'assembly, vu que ce n'est pas un assembly.

    Normalemnet, tu tentes d'y accéder avec P/Invoke (l'attribut DllImport) et je ne sais pas pourquoi tu as une BadImageFormatException si les deux sont en x86 32 bits...
    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.

  14. #14
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Janvier 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Je vais essayer de faire la manip avec un systeme 32 bits. Merci bcp Médinoc

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu as plusieurs moyen de connecter C++ et C# :
    - P/Invoke (mais tu te limites à une interface C, c'est généralement une bonne solution quand tu as quelques appels simples à faire)
    - COM (mais ta DLL C++ doit exposer des objets COM, si c'est déjà le cas tant mieux, sinon, je te le déconseille)
    - En écrivant en C++/CLI une couche d'interface par dessus ta bibliothèque C++ qui sera directement accessible en C#. C'est certainement le plus riche (et probablement le plus performant), mais ça demande un peu de boulot.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/07/2013, 19h02
  2. [Débutant] Intéropérabilité d'une bibliothèque C avec du C#
    Par Cool_Boy dans le forum C#
    Réponses: 1
    Dernier message: 13/07/2013, 12h29
  3. [Débutant] Intéropérabilité d'une bibliothèque C avec du C#
    Par Cool_Boy dans le forum C#
    Réponses: 11
    Dernier message: 08/07/2013, 15h22
  4. Réponses: 9
    Dernier message: 10/01/2008, 16h44

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