Je travaille sur une application console .NET 3.5 en C# qui utilise une DLL non gérée VC++. Il a fonctionné sans problème lorsque j'ai travaillé dessus il y a quelques semaines, mais j'y reviens aujourd'hui et je reçois maintenant une exception BadImageFormatException ("Une tentative a été faite pour charger un programme avec un format incorrect." (Exception de HRESULT:Autre cause de BadImageFormatException dans l'assembly .NET?
Mon poste de travail de développement exécute 64 bits Windows 7, et je fais beaucoup de travail avec du code non géré, donc j'ai immédiatement vérifié que l'ensemble .NET et la bibliothèque VC++ avaient tous les deux des cibles x86.
Juste pour être sûr, je nettoyais et reconstruit la bibliothèque du VC et l'ensemble de .NET, en vain.
aucun système rien fait particulièrement inhabituel. les charges de la bibliothèque du VC un dat binaire un fichier et fait un traitement mathématique sur son contenu. L'assembly .NET a le DllImports pour la bibliothèque et du code pour le câbler. Tout cela a fonctionné il y a quelques semaines. Donc maintenant je me demande s'il y a une autre cause de BadImageFormatException qui est moins commune qu'un conflit x86/x64 que je pourrais rencontrer.
Merci.
EDIT: J'obtiens la même erreur quel que soit le mode x86 ou x64, mais lorsqu'il est défini sur 'Any CPU', l'exécution dépasse ce point, mais l'exécution échoue lors d'un appel ultérieur à la bibliothèque VC++ sans exception. Indépendamment de savoir si cela est lié à ce problème, y a-t-il quelque chose que 'Any CPU' fait différemment de x86 et x64, ce qui pourrait éclairer cela?
Y at-il une chance que l'application en cours d'exécution ait accès à une version x64 de la bibliothèque VC++ et qu'elle essaie de charger celle-ci à la place? Ou, votre application en cours pourrait cibler AnyCPU et pas x86? AnyCPU sera chargé en 64 bits si vous utilisez un environnement 64 bits. – Anzurio
Bonnes questions. Le premier ne semble pas être le cas, j'ai essayé de copier le projet sur une autre machine qui n'a jamais eu de copie de la bibliothèque, en prenant soin de ne copier que la version x86 de l'assemblage. Le même problème est survenu sur l'autre machine. L'application est définitivement définie sur x86. Par curiosité, je l'ai configuré pour fonctionner dans 'Any CPU'. Lorsque je fais cela, il passe le premier appel à la bibliothèque VC++ (où il meurt lorsqu'il est défini sur x86 ou x64) mais l'exécution se termine lors d'un appel ultérieur à la bibliothèque. –
Exécutez Dependency Walker x86 sur votre fichier .exe, puis sur votre fichier .dll. J'ai eu ce problème une fois après avoir copié msvcr120.dll de system32 sur un ordinateur 64 bits. Oy! –