J'appelle des fonctions à partir d'une DLL non gérée 32 bits sur un système 64 bits. Ce que je reçois est:
BadImageFormatException: une tentative de chargement d'un programme avec un format incorrect a été effectuée. (Exception de HRESULT: 0x8007000B)
Au début, j'avais mes projets définis sur la plate-forme Any CPU, je les ai donc tous deux modifiés en x86, mais cette erreur se produit toujours. C'est vraiment le seul correctif que je connais pour cela.
Les DLL ne sont pas corrompues ou quoi que ce soit, car je peux les utiliser avec d'autres programmes (dont je n'ai pas la 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 serait-ce pas jeter un DllNotFoundException
dans ce cas?
Que puis-je faire d'autre? Et avant de dire "Utilisez une DLL 64 bits non gérée à la place", permettez-moi de souligner qu'il n'y en a pas. ;)
Réponses:
Si vous essayez d'exécuter des applications 32 bits sur IIS 7 (et / ou un système d'exploitation 64 bits), vous obtiendrez la même erreur. Donc, depuis IIS 7, faites un clic droit sur le pool d'applications des applications et allez dans "Paramètres avancés" et changez "Activer les applications 32 bits" en "VRAI".
Redémarrez votre site Web et cela devrait fonctionner.
la source
D'une manière ou d'une autre, la case à cocher Générer dans le Gestionnaire de configuration n'avait pas été cochée pour mon exécutable, donc il fonctionnait toujours avec l'ancienne génération Any CPU. Après avoir corrigé cela, Visual Studio s'est plaint qu'il ne pouvait pas déboguer l'assembly, mais cela a été corrigé avec un redémarrage.
la source
Dans Visual Studio , cliquez avec le bouton droit sur votre projet -> Dans le volet gauche, cliquez sur l' onglet Générer ,
sous Platform Target, sélectionnez x86 (ou plus généralement l' architecture à associer à la bibliothèque à laquelle vous liez)
J'espère que ça aidera quelqu'un! :)
la source
J'ai juste eu ce problème aussi. J'ai essayé toutes les suggestions ici, mais elles n'ont pas aidé.
J'ai trouvé une autre chose à vérifier qui l'a corrigé pour moi. Dans Visual Studio, cliquez avec le bouton droit sur le projet et ouvrez "Propriétés". Cliquez sur l'onglet "Compiler" (ou "Créer") 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. Autrement dit, si vous construisez "Any CPU" alors "Target CPU" devrait dire "Any CPU". Parcourez toutes vos plateformes en les rendant actives et vérifiez ce paramètre.
la source
Si vous rencontrez cette erreur lorsque vous cliquez sur le bouton fléché vert pour exécuter l'application, mais que vous souhaitez toujours exécuter l'application en 64 bits. Vous pouvez le faire dans VS 2013, 2015, 2017 et 2019
Accédez à: Outils> Options> Projets et solutions> Projets Web> Utilisez la version 64 bits d'IIS Express
la source
Si vous utilisez un processeur , vous pouvez rencontrer ce problème si l' option Préférer 32 bits est cochée:
Assurez-vous de décocher cette option dans l' onglet Build de la propriété du projet !
la source
Un peu hors sujet pour ce post, mais la recherche de ce message d'erreur m'a amené ici.
Si vous générez via le système d'équipe et que vous obtenez cette erreur, l'onglet de processus de définition de génération a un paramètre «MSBuild Platform». Si ce paramètre est défini sur "Auto", vous pouvez rencontrer ce problème. Le changer en "X86" peut également résoudre l'erreur.
la source
Dans mon cas, j'utilisais une DLL native en C #. Cette DLL dépendait de quelques autres DLL manquantes. Une fois ces autres DLL ajoutées, tout a fonctionné.
la source
S'appuyant sur la réponse de @paibamboo
Il a dit: Allez dans: Outils> Options> Projets et solutions> Projets Web> Utilisez la version 64 bits d'IIS Express
Mon collègue a fait cocher cette case (il l'a explicitement recherchée), mais avait le message d'erreur en question. Au bout de quelques heures, il décocha la case et la vérifia de 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 enregistré et qui ne sont plus synchronisés. Le décocher et le revérifier le synchronise à 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?
la source
Voir également cette réponse , qui a résolu le même problème pour moi.
la source
Dans mon cas, j'utilise un minuscule .exe qui recharge les DLL référencées via Reflection. Je fais donc juste ces étapes qui me sauvent la journée:
À partir des propriétés du projet sur l'explorateur de solutions, dans l'onglet de construction, je choisis la cible cible depuis x86
la source
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 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 pour les tests.
la source
Nous avons eu un problème similaire et nous avons réussi à le résoudre en définissant la cible de la plate-forme sur x86.
la source
J'ai résolu ce problème de la manière «Windows». Après avoir vérifié tous mes paramètres, nettoyé et reconstruit la solution, je ferme simplement la solution et la rouvre. Ensuite, cela 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. :)
la source
J'ai pu résoudre ce problème en faisant correspondre ma version de build à 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 la 4.5 ...
J'ai donc rétrogradé à 4.0 et cela a fonctionné!
Assurez-vous donc que vos versions correspondent. Il a bien fonctionné sur ma boîte de développement, mais le serveur avait une version .NET plus ancienne.
la source
Dans mon cas, le contenu du fichier était incorrect. La DLL a été téléchargée à partir du Web, mais le contenu de la DLL était une page HTML: D Essayez de vérifier s'il s'agit d'un fichier binaire, s'il semble correct DLL :)
la source
Nous avions le même problème dans .NET core. La solution était de télécharger le runtime .netcore 32 bits et d'avoir la cible de votre projet
x86
Dans votre
csproj
fichier ajoutezCela a été utilisé pour une machine Windows, vous devrez ajuster les chemins et autres pour Linux / OSX
la source
Si vous importez une DLL non managée, utilisez
dans votre méthode d'importation de DLL.
la source
1: Accédez à: Outils> Options> Projets et solutions> Projets Web> Utilisez la version 64 bits d'IIS Express 2: modifiez le paramètre ci-dessous pour le projet de service Web.
la source