web-dev-qa-db-fra.com

System.BadImageFormatException lorsque l'infrastructure cible est 4.0

J'ai une exception d'exécution après avoir modifié Target Framework en .net framework 4: 

Lorsque vous construisez avec le framework cible 3.5, tout fonctionne correctement.

La plate-forme que je construis est en x86 (j'ai découvert que la construction en x64 nuit cause le problème).

Quel peut être le problème?

17
Erik Sapir

MSDN répertorie les raisons possibles, alors je suggérerais de parcourir cette liste comme une liste de contrôle:

  • Vous tentez de charger une bibliothèque de liens dynamiques non gérée ou un exécutable (telle qu'une DLL système Windows) comme s'il s'agissait d'un assembly .NET Framework.

  • Un DLL ou un fichier exécutable est chargé en tant qu'assembly 64 bits, mais il contient des fonctionnalités ou des ressources 32 bits. Par exemple, il s'appuie sur COM interop ou appelle des méthodes dans une bibliothèque de liens dynamiques 32 bits.

  • Les composants ont été créés à l'aide de différentes versions du .NET Framework. En règle générale, cette exception se produit lorsqu'une application ou un composant développé à l'aide de .NET Framework 1.0 ou .NET Framework 1.1 tente de charger un assembly développé à l'aide de .NET Framework 2.0 SP1 ou version ultérieure, ou lorsqu'une application développée à l'aide de .NET Framework 2.0 SP1 ou .NET Framework 3.5 tente de charger un assembly développé à l'aide de .NET Framework 4. L'exception BadImageFormatException peut être signalée sous forme d'erreur de compilation ou l'exception peut être levée au moment de l'exécution.

L'idée est de s'assurer que tous vos projets et dépendances sont soit compilés pour cibler la même version de l'infrastructure, soit une version précédente; et que chacun de vos projets est compatible en termes de bitiness; et si vous chargez des bibliothèques de manière dynamique, veillez à les charger (par exemple, n’essayez pas de charger des bibliothèques natives en tant qu’assemblages gérés).

Peut-être qu’ajouter quelques informations sur la configuration/les dépendances de votre projet nous permettrait d’être plus décisif.

22
Grant Thomas

Assurez-vous que tous les projets de votre solution génèrent x86 ou x64 ou Any Cpu - toute incompatibilité peut être à l'origine de ce problème.

De même, si vous utilisez des bibliothèques tierces, vérifiez également leur plate-forme cible.

Une autre chose à considérer est de savoir si cela est hébergé dans IIS - auquel cas vous devez vous assurer que le nombre de bits de vos assemblys correspond à celui du processus d'hébergement IIS. Si vous êtes sur un ordinateur x64, il s'agira probablement de x64 (sauf si l'hébergement 32 bits a été activé).

Je dois dire que, en règle générale, je ne dévie pas de Any CPU sauf si ma dépendance externe vis-à-vis d'un composant COM n'est que x86 ou x64. Cela provoque presque toujours des maux de tête.

15
Andras Zoltan

Très probablement, l'un de vos assemblages fait référence à un assemblage x64 lorsque vous construisez pour x86 ou à un x86 lorsque vous générez pour x64.

7
Daniel Hilgarth

Si votre projet était en cours d'exécution pour la première fois et que cette erreur a commencé à se produire après la modification de votre infrastructure cible, cela peut également signifier que Visual Studio a apporté des modifications à la construction et que certaines de vos bibliothèques ne sont plus compatibles.

Alors, essayez de passer par les configurations de construction.

Cela aidera principalement: Allez dans les Propriétés de l’application> Construire> Cochez la case 'Préfère 32 bits'

5
Ozesh

J'ai eu exactement ce problème aujourd'hui, la BadImageFormatException ne s'est produite que lorsque j'ai modifié le cadre cible en un élément> 3.5. Toutes les autres réponses sur SO à propos de cette exception parlent du nombre de bits (32 vs 64) de nos assemblages (problème courant, mais qui ne s'applique pas à ce cas).

Si le projet fonctionne correctement lorsqu'il est créé avec .NET 3.5 et lève une exception BadImageFormatException sur .NET 4.0 ou version ultérieure, vérifiez que votre fichier App.config contient un élément supportedRuntime. Le mien a dit ceci:

<supportedRuntime version="v2.0.50727" sku="Client" />

Cela va forcer votre programme à s'exécuter sur le runtime .NET 2.0, qui ne peut pas charger les images .NET 4.0 (mais il peut charger les images .NET 3.5). Toute ligne indiquant cela doit être supprimée lors du passage à une version de framework supérieure à 3.5.

3
Segfault

Si vous travaillez sur la structure 4.5, essayez de décocher l'option "Préférez la case à cocher 32 bits" de l'onglet "Débogage" des propriétés du projet.

Nous avions le même problème avec le framework 4.5. Essayé de nombreuses options. Enfin, nous avons décoché l'option "Préférez la case à cocher 32 bits" de l'onglet "Débogage" des propriétés du projet et travaillé. 

2
Ishan Pandya

vous devez sélectionner le mode de débogage au lieu du mode de libération dans les configurations de solution. 

0
Hello World

 enter image description here

Si vous obtenez cette erreur lorsque vous démarrez le débogage à partir d'un projet dll, assurez-vous de pointer l'exécutable et le répertoire de travail sur l'exécutable et le répertoire de travail attendus.

0
dcarl661