501 votes

Impossible de charger le fichier ou l'assemblage ... Une tentative a été faite pour charger un programme dont le format est incorrect (System.BadImageFormatException)

J'ai deux projets, ProjectA et ProjectB . ProjectB est une application console, qui dépend de ProjectA . Hier, tout fonctionnait bien, mais soudainement aujourd'hui, lorsque j'exécute ProjectB Je comprends :

BadImageFormatException n'a pas été géré :
Impossible de charger le fichier ou l'assemblage 'ProjectA, Version=1.0.0.0, Culture=neutre, PublicKeyToken=null' ou l'une de ses dépendances. Une tentative a été faite pour charger un programme dont le format est incorrect.

Les deux sont des projets ordinaires, sans aucune dépendance avec d'autres projets non .Net. Les deux sont entièrement .Net - il n'y a pas de code natif, ni de P/Invoke. J'ai d'autres projets qui dépendent de ProjectA et fonctionnent toujours très bien.

Des choses que j'ai essayées :

  • Assurez-vous que les deux projets sont réglés sur "Any CPU", avec l'option construire case cochée. Ils le sont.
  • Assurez-vous que les deux projets sont destinés au même Target Framework. (.Net 4.0 Profil du client) .
  • Sous ProjectB --> Références --> ProjectA --> Propriétés, assurez-vous que "Copie locale" est réglé sur "Vrai" _ (J'ai vérifié que ProjectA.dll est copié correctement)
  • Nettoyer/reconstruire la solution. J'ai même essayé de supprimer manuellement les dossiers /bin et /obj dans les deux projets.
  • Redémarrez Visual Studio. Redémarrer mon ordinateur.
  • Vérifiez une copie entièrement nouvelle du référentiel.

Mais je reçois toujours la même erreur. Je n'ai aucune idée de ce que j'ai fait pour provoquer cela, ni de la façon de le réparer. Avez-vous une idée ?

4 votes

Si vous avez un historique des versions dans le référentiel, pouvez-vous vérifier s'il y a des différences dans les fichiers csproj ?

1 votes

@Steve : Selon Mercurial, aucun changement autre que l'ajout de références aux nouveaux fichiers .cs.

1 votes

Obtenez-vous le même comportement sur une autre machine ? Est-ce que quelque chose d'autre a changé sur la machine (par exemple, mise à jour de Windows, mises à jour des dépendances, etc.)

773voto

icemanind Points 13724

Je suis presque sûr que vous avez un conflit 32-bit / 64-bit. Il semble que votre projet dépendant soit configuré en 32 bits alors que la classe qu'il référence est configurée en 64 bits. Essayez de regarder cette question SO et celui-ci aussi . Entre les deux, vous devriez être en mesure de résoudre votre problème.

83 votes

Do'h. J'ai en quelque sorte complètement manqué la liste déroulante "platform target" dans project-->properties-->build - il était réglé sur x86 ; le régler sur "Any CPU" a résolu le problème. J'ai toujours pensé que ce paramètre était identique à la liste déroulante "platform target" dans le gestionnaire de configuration, mais apparemment ce n'est pas le cas. (en fait, la "cible de la plate-forme" dans le gestionnaire de configuration ne semble pas faire quoi que ce soit du tout !)

12 votes

Vérifiez également que le projet n'est pas Any CPU avec Prefer 32 bit coché. Projet -> propriétés -> build

34 votes

PS : Une autre raison est que "Activer les applications 32 bits" est "false" dans les paramètres du pool d'applications. Vous devez redémarrer IIS après l'avoir réglé sur "true".

239voto

Ali Adravi Points 932

Il se peut que vous rencontriez un problème avec votre site web après l'avoir déployé sur le serveur.

Vous devez alors adapter votre pool d'applications à l'application Enable-32 et tout sera résolu.

Étape

  1. Ouvrez votre IIS
  2. cliquez sur le pool d'applications
  3. Sélectionnez le pool d'applications que vous utilisez
  4. A partir du panneau droit, cliquez sur paramètres avancés
  5. Définir Autoriser les applications 32 bits à ture

enter image description here

2 votes

J'ai raté quelque chose ? L'OP parle d'un application console pas le déploiement de IIS : "ProjectB est une application de console, qui dépend de ProjectA"

2 votes

Excellente réponse @AliAdravi

38voto

J'ai eu le même problème. J'avais réglé la "Plate-forme cible" du projet A ("Projet A" (clic droit)->Propriétés->Construire->"Plate-forme cible") sur x86 mais gardé le projet B sur "Tout CPU". Le réglage de Project B sur "x86" a réglé le problème.

10voto

fergal303 Points 31

Vous devrez peut-être modifier le Pool d'applications en mettant "Enable 32bit Applications" sur TRUE dans IIS7 si vous avez au moins 1 dll 32bit \exe dans votre projet.

0 votes

Le PO parle d'une application console et non d'IIS.

3voto

Flood Techs Points 1

J'ai eu le même problème avec plusieurs projets dans la même solution, j'ai fini par définir tous les cadres cibles à .NET Framework 4 et x86 pour le CPU cible et il a finalement compilé avec succès.

1 votes

Fonctionne dans la version Release mais échoue dans Debug. J'ai tout réglé sur .Net Framework 4 (PAS la mise à jour 1) et Debug fonctionne maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X