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 :

System.BadImageFormatException et X64


Sujet :

C++/CLI

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut System.BadImageFormatException et X64
    Bonjour,

    J'utilise une bilbliothèque écrite en C depuis un programme en c#.
    Bien que cela n'ait pas été sans difficulté, grâce à l'excellent tutorial sur l'interopérabilité, je suis arrivé à mes fins.

    Je développe sur Vista x86 et tout fonctionne bien. En revanche, lorsque je veux passer sur Vista X64, j'ai une exception System.BadImageFormatException au moment de l'appel aux fonctions C.

    Je "sens" bien qu'il y a certainement un problème du style "Le c# s'execute en 64 bits mais la librairie C en 32", mais je sèche un peu sur les pistes à explorer pour corriger cela. Je trouve assez peu de documentation sur cette exception et le fait que cela se produise au passage de x86 à X64.

    Pour informations, la librairie est un projet Open Source, je dispose donc des sources pour explorer d'autres pistes (d'ailleurs, utiliser le code C en dll est-il le seul ou le meilleur moyen d'accéder aux fonctions C ?)

    Merci,
    Novick

  2. #2
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut
    Bonjour,

    j'ai poursuivi mes recherches et j'ai trouvé une réponse que je vous livre ici :
    http://forum.velleman.be/viewtopic.p...74093fc7357306
    Je la teste lundi et vous informe du résultat.

    Je maintiens cependant une question plus générale qui est "Sachant que j'ai les sources de cette DLL, le seul moyen et le meilleur d'y accéder est bien de faire du DLLIMPORT ? N'y a t'il pas d'autres solutions plus faciles et/ou performantes"

    Merci pour vos réponses.

  3. #3
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par Novick Voir le message
    Je maintiens cependant une question plus générale qui est "Sachant que j'ai les sources de cette DLL, le seul moyen et le meilleur d'y accéder est bien de faire du DLLIMPORT ? N'y a t'il pas d'autres solutions plus faciles et/ou performantes"
    A priori non, tu ne peut pas faire mieux que du P/Invoke, sauf bien sur si tu veux traduire toute une lib du C vers le C#.
    J'ai une idée cependant, si tu faisait un wrapper en C++/CLI, et que les fonctions en C tu les chargeaient dynamiquement et tu copile ton code C à la foi en x64 et x86, je veux dire :
    - Le C# appèle le C++ CLI
    - Le C++ regarde si on est en x86 ou en x64 et charge la version appropriée de la dll, puis appèlle la fonction
    - La dll en C fait le boulot ...

    C'est juste une idée, ça pourrai t'inspirer ...

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut
    Citation Envoyé par smyley Voir le message
    A priori non, tu ne peut pas faire mieux que du P/Invoke, sauf bien sur si tu veux traduire toute une lib du C vers le C#.
    J'ai une idée cependant, si tu faisait un wrapper en C++/CLI, et que les fonctions en C tu les chargeaient dynamiquement et tu copile ton code C à la foi en x64 et x86, je veux dire :
    - Le C# appèle le C++ CLI
    - Le C++ regarde si on est en x86 ou en x64 et charge la version appropriée de la dll, puis appèlle la fonction
    - La dll en C fait le boulot ...

    C'est juste une idée, ça pourrai t'inspirer ...

    Ca parait très intéressant... Je n'ai plus écrit de C++ depuis 1997 (et vi ), y a t'il un tutorial ou de la documentation pour me guider dans la démarche d'écrire un wrapper en C++ CLI ?

  5. #5
    Expert confirmé
    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
    Par défaut
    Je pense qu'il doit y avoir ça dans les cours ou sur google
    Là je pourrai pas vraiment t'aider vu que les rares choses que je sais faire en C++ sont buggées ....

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut
    Citation Envoyé par Novick Voir le message
    Je la teste lundi et vous informe du résultat.
    J'ai compilé la DLL en x64 et ça fonctionne

  7. #7
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Bonjour, j'ai exactement le même problème.

    Je suis sur une machine x64 et j'utilise une DLL compilée en x86. La contrainte du x64 est imposée du fait que le serveur est du x64.

    Le problème étant que je n'ai pas la main sur les sources de ma DLL (contrairement à mon prédécesseur).

    Deux question se posent alors :
    - Peut-on règler ce problème sans recompiler la DLL?
    - Dans le cas échéant, y-a-t-il possibilité de compiler mes développements C++ / CLI et C# en x86 sur du x64? (Options dans VS ou de compilation?!).

  8. #8
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    A titre d'information, le problème a été résolu en configurant le compilateur .NET en mode 32 bits afin de respecter l'hétérogénéité des composants.

    Pour cela, il faut aller dans les menus suivants pour les différents types de projets :

    - C++/CLI : Clic droit projet / Properties / Onglet Linker => Advanced / Positionner Target machine sur MachineX86 (/MACHINE:X86)
    - C# : Clic droit projet / Properties / Onglet Build / Platform Target / Positionner sur x86.

  9. #9
    Expert confirmé
    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
    Par défaut
    La solution la plus élégante serai de faire un serveur COM Out-Of-Proc en C++ 32bits car vu que ce n'est pas les mêmes processus, WOW64 peut faire la transition du 64bits vers le 32bits pour les appels au COM. Mais bon, ça nécessite un gros travail d'écriture pour développer un serveur COM basé sur les fonctions de la dll ...

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/03/2012, 11h24
  2. System.badImageFormatException et x86
    Par Ghurdyl dans le forum C++/CLI
    Réponses: 2
    Dernier message: 06/07/2009, 13h30
  3. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  4. [VB6] [Système] Icones du systray qui veulent pas partir
    Par Ctof dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/10/2002, 09h41
  5. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47

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