2010-03-22 10 views
6

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?

+0

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

+0

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. –

+0

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! –

Répondre

3

Vous essayez peut-être de charger un assembly construit pour CLR 4.0 sur CLR 2.0.

+0

Merci pour la réponse rapide, mais nous n'avons aucune installation de Visual Studio 2010 ici, donc pas de CLR 4.0. –

2

Compte tenu de votre utilisation du code natif ici, je pense que le problème le plus probable ici est que vous essayez de charger une DLL native comme s'il s'agissait d'un assemblage .Net. C'est un scénario qui engendrera un BadImageFormatException. Essayez d'exécuter votre application et définissez-la pour lancer sur lancer pour BadImageFormatException et voir quelle DLL est en cours de chargement. Si c'est un natif alors c'est le problème.

4

Lorsque j'obtiens cette erreur, elle est toujours provoquée par le chargement d'une DLL 32 bits dans un processus 64 bits.

Définissez le fichier EXE à compiler en x86 et voyez si cela fonctionne.

+0

Comme je l'ai dit dans la question initiale, tout est défini sur x86. –

+0

Cela m'a aidé, merci beaucoup. – ChaosPandion

+0

m'a sauvé heures + – Xaqron

3

Vérifiez un conflit de chargement .dll! J'appelais un dll C++/CLI de C#

la bibliothèque C++/CLI est un wrapper autour d'une DLL native tierce.

Il s'avère que j'avais deux dll avec le même nom, à la fois dans le chemin (libeay32.dll).

Afin de découvrir la source du problème que j'installé les fenêtres d'outils de débogage: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

Run 'gflags' (dans "c:... \ Program Files \ Debugging Tools" dossier) afin de activer l'affichage du chargeur "snaps"

ie

> gflags -i <my test app.exe> +sls 

l'application puis exécuté dans cdb (débogueur de la console) ou windbg et au chalut par la sortie pour savoir qui a provoqué l'exception dll.

par exemple. Renommer le 'mauvais' libeay32.dll a démontré le problème, mais n'est qu'une solution temporaire!

La même approche de recherche de pannes peut fonctionner pour vous de toute façon.

0

Dans mon cas, désactiver Enable unmanaged code debugging dans l'onglet Débogage des propriétés du projet EXE a ironiquement fait l'affaire, si elle est cochée.

Pour être honnête, je ne sais pas pourquoi c'est la cause du problème.