“On a tenté de charger un programme avec un format incorrect” même lorsque les plates-formes sont identiques

J’appelle des fonctions à partir d’une DLL non gérée 32 bits sur un système 64 bits. Ce que j’obtiens c’est:

BadImageFormatException: une tentative de chargement d’un programme avec un format incorrect a été effectuée. (Exception de HRESULT: 0x8007000B)

Au début, mes projets étaient configurés sur la plate-forme Any CPU, alors je les ai tous deux changés pour x86, mais cette erreur se produit toujours. C’est vraiment le seul correctif que je connaisse pour cela.

Les DLL ne sont pas corrompues, car je peux les utiliser avec d’autres programmes (auxquels je n’ai pas de source). Je pensais que ce n’était peut-être pas une dépendance, mais j’ai vérifié et ils sont tous là. De plus, ne lancerait-il pas une DllNotFoundException dans ce cas?

Que puis-je faire d’autre? Et avant de dire “Utilisez plutôt une DLL non gérée 64 bits”, laissez-moi vous faire remarquer qu’il n’y en a pas. 😉

Si vous essayez d’exécuter des applications 32 bits sur IIS 7 (et / ou sur un système d’exploitation 64 bits), vous obtenez la même erreur. Ainsi, à partir d’IIS 7, cliquez avec le bouton droit de la souris sur le pool d’applications des applications et accédez à «Paramètres avancés» et définissez «Activer les applications 32 bits» sur «TRUE».

Redémarrez votre site Web et cela devrait fonctionner.

entrer la description de l'image ici

D’une manière ou d’une autre, la case à cocher Build du Configuration Manager avait été décochée pour mon exécutable, de sorte qu’elle fonctionnait toujours avec l’ancienne version de Any CPU. Après avoir corrigé cela, Visual Studio s’est plaint de ne pas pouvoir déboguer l’assembly, mais cela a été corrigé avec un redémarrage.

Dans Visual Studio , cliquez avec le bouton droit sur votre projet -> Dans le volet gauche, cliquez sur l’onglet Générer ,

Propriétés du projet, onglet de construction

sous Platform Target, sélectionnez x86 (ou plus généralement l’ architecture correspondant à la bibliothèque à laquelle vous vous connectez)

Propriétés du projet, cible de la plate-forme

J’espère que ça aidera quelqu’un! 🙂

Je viens d’avoir ce problème aussi. Essayé toutes les suggestions ici, mais ils n’ont pas aidé.

J’ai trouvé une autre chose à vérifier qui a résolu le problème pour moi. Dans Visual Studio, cliquez avec le bouton droit sur le projet et ouvrez “Propriétés”. Cliquez sur l’onglet “Comstackr”, puis cliquez sur “Options de compilation avancées” en bas.

Vérifiez la liste déroulante “CPU cible”. Il doit correspondre à la “plate-forme” que vous construisez. C’est-à-dire que si vous créez “N’importe quelle CPU”, alors “CPU cible” devrait dire “N’importe quelle CPU”. Parcourez toutes vos plates-formes en les rendant actives et vérifiez ce paramètre.

Si vous rencontrez cette erreur lorsque vous cliquez sur le bouton flèche verte pour exécuter l’application, mais que vous souhaitez toujours exécuter l’application en 64 bits. Vous pouvez le faire dans VS 2013 ou 2015

Allez à: Outils> Options> Projets et solutions> Projets Web> Utiliser la version 64 bits d’IIS Express

Si vous utilisez Any CPU , vous pouvez rencontrer ce problème si l’option Prefer 32-bit est cochée:

Assurez-vous de décocher cette option dans l’onglet Build de la propriété du projet !

entrer la description de l'image ici

Un peu hors sujet pour cet article, mais la recherche de ce message d’erreur m’a amené ici.

Si vous construisez à travers le système d’équipe et obtenez cette erreur, l’onglet du processus de définition de génération a un paramètre “Plate-forme MSBuild”. S’il est défini sur “Auto”, vous pouvez rencontrer ce problème. Le remplacer par “X86” peut également résoudre l’erreur.

Dans mon cas, j’utilisais une DLL native en C #. Cette DLL dépendait de deux autres DLL qui manquaient. Une fois ces autres DLL ajoutées, tout fonctionnait.

Voir aussi cette réponse , qui a résolu le même problème pour moi.

Publié par Luis Mack le 5/12/2010 à 8h50 J’ai trouvé le même problème, uniquement pour un projet spécifique lors de la compilation sur une machine 64 bits. Un correctif que SEEMS doit utiliser consiste à modifier manuellement un caractère dans le stream d’images CHAQUE FOIS, le contrôle ou le formulaire utilisateur est modifié dans le concepteur.

  AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w 

Changer pour

  AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w 

C’est 00LjAuMC4w de retour à 0yLjAuMC4w à la fin de la ligne (00 retour à 0y)

Dans mon cas, j’utilise un minuscule fichier .exe qui recharge les DLL référencées via Reflection. Donc, je fais juste ces étapes qui sauve ma journée:

À partir des propriétés du projet sur l’explorateur de solutions, à l’onglet de construction, je choisis la cible cible x86

Dans mon cas, j’exécutais des tests via MSTest et j’ai découvert que je déployais à la fois une DLL 32 bits et une DLL 64 bits dans le répertoire de test. Le programme favorisait la DLL 64 bits et provoquait son échec.

TL; DR Assurez-vous de ne déployer que des DLL 32 bits sur des tests.

J’ai résolu ce problème à la manière de Windows. Après avoir vérifié tous les parameters, nettoyé la solution et reconstruit la solution, il me suffit de fermer la solution et de la rouvrir. Alors ça a fonctionné, donc VS ne s’est probablement pas débarrassé de certaines choses pendant le nettoyage. Lorsque les solutions logiques ne fonctionnent pas, je me tourne généralement vers des solutions illogiques (ou apparemment illogiques). Windows ne me laisse pas tomber. 🙂

J’ai pu résoudre ce problème en faisant correspondre la version de ma version à la version .NET sur le serveur.

J’ai double-cliqué sur le .exe juste pour voir ce qui se passerait et il m’a dit d’installer 4.5 ….

J’ai donc rétrogradé à 4.0 et cela a fonctionné!

Assurez-vous donc que vos versions correspondent. Il fonctionnait bien sur ma boîte de développement, mais le serveur avait une version plus ancienne de .NET.

S’appuyant sur la réponse de @paibamboo

Il a déclaré: Allez à: Outils> Options> Projets et solutions> Projets Web> Utiliser la version 64 bits d’IIS Express

Mon collègue a fait cocher cette case (il l’a explicitement recherchée), mais le message d’erreur était en cause. Après quelques heures, il décochait la case et la vérifiait à nouveau. Et voilà: le code a maintenant fonctionné avec succès.

Il semble qu’il y ait deux endroits où l’état de cette boîte est sauvegardé et qui devient désynchronisé. Annuler et revérifier il synchronisé à nouveau.

Question pour les utilisateurs plus avertis: Y a-t-il eu une mise à jour ou quelque chose la semaine dernière (pour VS 2015) qui a désynchronisé les états?

Dans mon cas, le contenu du fichier était erroné. DLL a été téléchargé à partir du Web, mais le contenu de la DLL était la page HTML: D Essayez de vérifier s’il s’agit d’un fichier binary, s’il semble que la DLL est correcte 🙂