BadImageFormatException:无法加载文件或程序集中的一个或多个依赖项。尝试加载具有不正确格式的程序。

15
我在我的控制台应用程序(VS2012)中引用了"dcasdk.dll",遇到了以下运行时错误。控制台应用程序的.Net框架为4.5,平台目标为“任何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的程序集绑定日志,根据错误信息的最后三行,似乎这是一个与程序集平台有关的问题。但由于这是一个第三方dll文件,我无法将其重新编译为任何特定的平台。请分享您对此该怎么处理的想法。

请注意,我正在运行64位的Windows7控制台应用程序。

*** 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","无法加载文件或程序集 'dcasdk.dll' 或其某个依赖项。找不到指定的模块。"。但这次在融合日志中没有错误!

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

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 Server R2的计算机上部署它作为Windows服务时,我再次遇到FileNotFoundException。

我尝试使用"Prefer 32"编译,结果出现"BadImageFormatException"。

如果我使用x86平台目标进行编译,虽然所需的所有dll都存在于服务文件夹中,但仍会出现FileNotFoundException。

有人能帮我理解部署出了什么问题吗?它在开发系统中按预期工作,使用"Any CPU,Prefer 32位 ON"。



一个简短的回答 - x64和x86版本的问题。 - Nikhil Agrawal
但是,这个DLL从哪里来呢?如果只是因为改变了位数就出现了“FileNotFoundException”,那么这似乎表明文件没有从/到你认为的位置复制。事实上,无论corflags告诉你什么,DLL要么是损坏的,要么它的位数与进程的位数不匹配。如有必要,请打开程序集绑定日志记录以再次检查“dacsdk”从哪里加载。 - Jeroen Mostert
感谢@JeroenMostert为我提供正确的方向,您能否请看一下我上面更新的问题?您有什么想法,错误“文件中的无效程序集平台或ContentType”是什么意思?即使我将“目标平台”更改为x86\x64,为什么这不起作用?请分享您的想法。再次感谢您的时间。 - SSQs
在你的web.config中尝试以下内容: 在<runtime>标签内添加如下代码: <dependentAssembly> <assemblyIdentity name="带引用的程序集名称" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" /> </dependentAssembly> 将程序集版本和程序集名称(例如System.Web.Helpers)替换为你自己的。 - PixelDev
@Vishal,这个不行...又出现了相同的“FileNotFoundException”错误。 - SSQs
请阅读[提问], 特别是关于编写良好标题的部分。异常信息通常不是一个好的标题。 - Heretic Monkey
3个回答

20

如前所述,可能是由于错误的架构导致: a) 在Windows x86上使用x64汇编 b) 在x64进程中使用x86汇编或反之

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

...或者存在未找到的一个依赖项,启用Fusion日志以查明它正在哪里收集程序集:

请参阅如何在.NET中启用程序集绑定失败日志记录(Fusion)http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx

更新:鉴于错误代码0x8007000b,我非常确定这是架构不匹配造成的: a)dll可能是完整的.NET代码,但未使用AnyCPU编译 b)dll可能是本地代码,然后需要匹配的架构(还有一些使用PInvoke调用其代码的情况) c)dll可能是C++ CLI(本地/.NET代码混合),同样具有错误的架构。 d)dll可能已损坏。

您可能需要联系第三方提供商以获得支持。 此链接还提到它可能是.NET版本不匹配。

无论如何,问题看起来已经被缩小了。

如果DLL部分为本地代码,则可能需要MSVC运行时(正如这个问题的答案所述,在64位系统上使用32位DLL会显示0x8007000B错误

在这种情况下,问题将是找不到dcasdk的依赖项。

您可以检查使用哪个Dependency Walker,请访问http://www.dependencywalker.com/(它还有一个配置文件模式,您可以在此模式下对exe进行性能剖析,并查看运行时失败的dll的调用)。

非常感谢您提供有关“Fusion”的信息。我已经在上面更新了我的问题,加入了“程序集绑定日志”。您能否请看一下?由于这是一个第三方dll,我无法重新编译它。是否有其他方法来解决这个问题? - SSQs
嗨,提供更多细节。 - Fernando Gonzalez Sanchez
1
你是对的!我联系了第三方提供商,他们确认dcasdk dll有两个依赖dll,添加后问题得到解决。 我将尝试使用Dependency Walker,因为在这种情况下它似乎非常有用。非常感谢你的时间和帮助! - SSQs
我简直不敢相信我没有看架构类型。这是一个愚蠢的错误,但这个答案让我清醒了。 - Chris

12
在VS中,点击工具,然后单击选项
在搜索栏中搜索“iis”,选中此选项,运行项目,对我来说这是有效的,因为我在Web项目中遇到了错误。 **输入图像描述**

这正是我遇到的问题,当我在VisualStudio中使用IISExpress进行本地调试时,它一直抛出这个错误。我搜索了一下,发现我的项目中没有引用x86,但似乎IISExpress有。将其切换为使用64位版本,一切都正常了,谢谢! - 97WaterPolo

4

右键点击项目设置,然后点击构建(Build)并将平台目标从"Any"更改为"x64"或"x86",根据你的dll设置。

我曾试图使用AnyCpu设置加载x64 dll。我将AnyCpu设置更改为x64后,它开始对我起作用。

enter image description here


这帮助我解决了我的问题。我的主项目是 Any CPU,但被引用的 DLL 只有 x86。将我的主项目更改为 x86 后,错误消失了。 - Kevin K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接