BadImageFormatException 无法加载文件或程序集或其依赖项之一。试图加载格式不正确的程序

BadImageFormatException Could not load file or assembly or one of its dependencies. An attempt was made to load a program with an incorrect format

我遇到 运行time 错误,我的控制台应用程序 (VS2012) 引用 "dcasdk.dll"。 控制台应用程序的 .Net Framework 是 4.5,平台目标是 "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.

我使用 CorFlags 应用程序检查了 dll 的目标平台。以下是详细信息..

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

根据以上信息,我认为 dll 也是使用 "Any CPU" 目标构建的。因此它应该与具有相同目标平台的控制台应用程序一起使用。我不确定为什么 运行.

时会出现此错误

我还尝试将目标平台更改为 x86,结果如下 "FileNotFoundException"。我在反射器中检查了 dll 的引用。它只显示 System.Xml 和 System.Data。哪些已作为参考添加到控制台应用程序中。

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

如有任何帮助,我们将不胜感激。

提前致谢。

下面是Fusion的Assembly Binding Log..根据最后三行错误信息,这似乎是装配平台的问题。但由于这是第三方 dll,我无法将其重新编译到任何特定平台。请在这里分享您对可以做什么的想法..

请注意,我运行在 Windows7、64 位 OS 上安装此控制台应用程序。

*** 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.

如果我将"Prefer 32-bit"设置为ON,那么上面的错误就消失了。但是我仍然得到 "FileNotFoundException"、"Could not load file or assembly 'dcasdk.dll' or one of its dependencies. The specified module could not be found."。但是这次 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.

"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()

问题和修复:

原来是dcasdk dll的依赖没有找到的问题。我确实联系了第三方提供商,他们确认 dcasdk dll 与另外两个 dll(稍后由他们提供)存在依赖关系,添加后解决了问题!

感谢大家帮助我理解问题。


当我尝试将此作为 windows 服务部署在 Windows 服务器 R2 上的机器 运行s 中时,我再次遇到 FileNotFoundException。

我尝试使用 "Prefer 32" 进行编译,结果是 "BadImageFormatException"。

如果我使用 x86 平台目标进行编译,我会收到 FileNotFoundException,尽管所有需要的 dll 都存在于服务文件夹中。

谁能帮我理解部署出了什么问题。它在 "Any CPU, Prefer 32bit ON".

预期的开发系统中工作

如前所述,要么是架构错误 a) 将 x64 程序集与 Windows x86 一起使用 b) 在 x64 进程中使用 x86 程序集,反之亦然

为获得最佳结果,请确保所有 .NET 程序集都是使用 "Any CPU" 和相同的 .NET 配置文件构建的(即全部使用 .NET Core、客户端配置文件或完整的 .NET)。

...或根本找不到一个依赖项,启用 Fusion Log 以告知要在哪里收集程序集:

How to enable assembly bind failure logging (Fusion) in .NEThttp://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx

更新:鉴于错误代码 0x8007000b,我很确定是架构不匹配: a) dll 可能是完整的 .NET 代码,但不是用 AnyCPU 编译的 b) dll 可能是本机代码,然后你需要一个匹配的架构(加上一些使用 PInvoke 调用它的代码) c) dll 可能是 C++ CLI(本机/.NET 代码的混合,同样具有错误的体系结构)。 d) dll 可能已损坏。

您可能需要联系第 3 方提供商以获得支持。 此外,这个 link 提到它可能是 .NET 版本不匹配。

总之,问题似乎缩小了。

此外,如果 DLL 部分是本机的,它可能需要 MSVC 运行时(正如这个问题的答案所提到的,Using 32-bit dll on 64-bit system shows 0x8007000B Error

在那种情况下,问题将是未找到 dcasdk 的依赖项。 您可以查看哪个 Dependency Walker,参见 http://www.dependencywalker.com/ (它还有一个配置文件模式,您可以在其中配置一个 exe,并查看打开一个在运行时失败的 dll 的调用)。

在 VS 中,转到工具,然后单击选项

在搜索栏中搜索 "iis" 并选中此选项,然后 运行 项目,这对我有用,因为我在 web 项目中遇到错误。

右键单击项目设置,然后单击构建并根据您的 dll 设置将平台目标从 Any 设置为 x64 或 x86。

对我来说,我尝试使用 AnyCpu 设置加载 x64 dll。我将 AnyCpu 设置更改为 x64,它开始为我工作。