web-dev-qa-db-fra.com

BadImageFormatException Impossible de charger le fichier ou l'assembly ou l'une de ses dépendances. Une tentative a été effectuée pour charger un programme avec un format incorrect

J'obtiens l'erreur d'exécution suivante, avec mon application de console (VS2012) qui fait référence à "dcasdk.dll". .Net Framework de l'application console est 4.5, la cible de la plateforme est "Any CPU".

Could not load file or Assembly 'dcasdk, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.

J'ai utilisé l'application CorFlags pour vérifier la plate-forme cible de la DLL. Voici les détails ..

Version : v4.0.30319
CLR Header : 2.5
PE : PE32
CorFlags : 16
ILONLY : 0
32BIT : 0
Signed : 0

Selon les informations ci-dessus, je pense que la DLL est également construite en utilisant la cible "Any CPU". Cela devrait donc fonctionner avec l'application console ayant la même plate-forme cible. Je ne sais pas pourquoi j'obtiens cette erreur lorsque je cours.

J'ai également essayé de changer la plate-forme cible en x86, ce qui donne la "FileNotFoundException" suivante. J'ai vérifié les références de la DLL dans le réflecteur. Il affiche uniquement System.Xml et System.Data. Qui sont déjà ajoutés comme référence dans l'application console.

Could not load file or Assembly 'dcasdk.dll' or one of its dependencies. The specified module could not be found.

Toute aide à ce sujet sera grandement appréciée.

Merci d'avance.

Vous trouverez ci-dessous le journal de liaison d'assemblage de Fusion .. selon les trois dernières lignes d'informations d'erreur, cela semble être un problème avec la plate-forme d'assemblage. Mais comme il s'agit d'une DLL tierce, je ne peux pas la recompiler sur une plate-forme spécifique. Veuillez partager vos réflexions sur ce qui peut être fait ici ..

Veuillez noter que j'exécute cette application de console sur Windows7, OS 64 bits.

*** Assembly Binder Log Entry  (4/26/2017 @ 8:31:08 AM) ***

The operation failed.
Bind result: hr = 0x8007000b. An attempt was made to load a program with an incorrect format.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\ConsoleApplication3\ConsoleApplication3\bin\Debug\ConsoleApplication3.vshost.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = dcasdk, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/ConsoleApplication3/ConsoleApplication3/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ConsoleApplication3.vshost.exe
Calling Assembly : ConsoleApplication3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\ConsoleApplication3\ConsoleApplication3\bin\Debug\ConsoleApplication3.vshost.exe.Config
LOG: Using Host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based Assembly bind).
LOG: Attempting download of new URL file:///C:/ConsoleApplication3/ConsoleApplication3/bin/Debug/dcasdk.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\ConsoleApplication3\ConsoleApplication3\bin\Debug\dcasdk.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: dcasdk, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null
ERR: Invalid Assembly platform or ContentType in file (hr = 0x8007000b).
ERR: Run-from-source setup phase failed with hr = 0x8007000b.
ERR: Failed to complete setup of Assembly (hr = 0x8007000b). Probing terminated.

Si je mets "Préférence 32 bits" sur ON, l'erreur ci-dessus disparaît. Cependant, j'obtiens toujours "FileNotFoundException", "Impossible de charger le fichier ou l'assemblage 'dcasdk.dll' ou l'une de ses dépendances. Le module spécifié est introuvable.". Mais cette fois, aucune erreur dans les journaux Fusion!

*** Assembly Binder Log Entry  (4/26/2017 @ 9:57:53 AM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\ConsoleApplication3\ConsoleApplication3\bin\Debug\ConsoleApplication3.vshost.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = dcasdk, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/ConsoleApplication3/ConsoleApplication3/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ConsoleApplication3.vshost.exe
Calling Assembly : ConsoleApplication3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\ConsoleApplication3\ConsoleApplication3\bin\Debug\ConsoleApplication3.vshost.exe.Config
LOG: Using Host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based Assembly bind).
LOG: Attempting download of new URL file:///C:/ConsoleApplication3/ConsoleApplication3/bin/Debug/dcasdk.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\ConsoleApplication3\ConsoleApplication3\bin\Debug\dcasdk.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: dcasdk, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null
LOG: Binding succeeds. Returns Assembly from C:\ConsoleApplication3\ConsoleApplication3\bin\Debug\dcasdk.dll.
LOG: Assembly is loaded in default load context.

Trace de pile "FileNotFoundException".

mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args)
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state)
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state)
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()

LE PROBLÈME et le correctif:

Il s'est avéré que les dépendances de dcasdk dll n'étaient pas trouvées. J'ai contacté le fournisseur tiers et ils ont confirmé que la DLL dcasdk avait une dépendance avec deux autres DLL (fournies par eux plus tard) qui, après avoir ajouté, ont résolu le problème!

Merci à tous de m'avoir aidé à comprendre le problème.


J'obtiens à nouveau FileNotFoundException lorsque j'essaie de déployer cela en tant que service Windows sur une machine exécutée sur le serveur Windows R2.

J'ai essayé de compiler avec "Prefer 32" On qui a abouti à la "BadImageFormatException".

Si je compile à l'aide de la cible de plate-forme x86, j'obtiens FileNotFoundException, bien que toutes les DLL requises soient présentes dans le dossier de service.

Quelqu'un peut-il m'aider à comprendre ce qui ne va pas avec le déploiement? Il fonctionne dans le système de développement comme prévu avec "Any CPU, Prefer 32bit ON".

6
SSQs

Comme déjà mentionné, cela est dû à une mauvaise architecture a) Utilisation de l'assemblage x64 avec Windows x86 b) Utilisation de l'assemblage x86 avec le processus x64 ou vice versa

Pour de meilleurs résultats, assurez-vous que tous les assemblys .NET sont construits avec "Tout processeur" et le même profil .NET (c'est-à-dire tous utilisant .NET Core, ou Profil client ou .NET complet).

... ou une dépendance introuvable du tout, activez Fusion Log pour savoir où cherche les rassemblements:

Voir Comment activer la journalisation des échecs de liaison d'assembly (Fusion) dans .NET et http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx

MISE À JOUR: Étant donné le code d'erreur 0x8007000b, je suis presque sûr qu'il s'agit d'une incompatibilité d'architecture: a) La DLL peut être du code .NET complet, mais non compilé avec AnyCPU b) La DLL peut être du code natif, puis vous avez besoin d'une architecture correspondante (plus certains appellent son code à l'aide de PInvoke) c) La dll peut être C++ CLI (mélange de code natif/.NET, encore une fois avec une mauvaise architecture). d) La DLL peut être corrompue.

Vous devrez peut-être contacter le fournisseur tiers pour obtenir de l'aide. En outre, ce lien mentionne qu'il pourrait s'agir d'une incompatibilité de la version .NET.

Quoi qu'il en soit, il semble que le problème soit réduit.

De plus, si le DLL est en partie natif, il peut avoir besoin du runtime MSVC (comme le mentionnent les réponses à cette question, L'utilisation d'une DLL 32 bits sur un système 64 bits affiche une erreur 0x8007000B )

Dans ce cas, le problème serait une dépendance de dcasdk introuvable. Vous pouvez vérifier quel Dependency Walker, voir http://www.dependencywalker.com/ (il a également un mode de profil où vous profilez un exe, et voir l'appel pour ouvrir une dll qui a échoué au moment de l'exécution) ).

Dans VS, allez dans outils , puis cliquez sur options .

Recherchez "iis" dans la barre de recherche et cochez cette option, puis exécutez le projet, cela fonctionne pour moi car j'obtenais une erreur dans le projet Web.

**enter image description here**

1
Muhammad Bilal