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?
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.
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.
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.
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.
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'
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.
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é.
vous devez sélectionner le mode de débogage au lieu du mode de libération dans les configurations de solution.