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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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