SSQ*_*SQs 5 .net c# .net-assembly badimageformatexception target-platform
我的控制台应用程序(VS2012)引用了“ dcasdk.dll”,因此出现运行时错误。控制台应用程序的.Net Framework为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.
Run Code Online (Sandbox Code Playgroud)
我使用CorFlags应用程序检查dll的目标平台。下面是详细信息。
Version : v4.0.30319
CLR Header : 2.5
PE : PE32
CorFlags : 16
ILONLY : 0
32BIT : 0
Signed : 0
Run Code Online (Sandbox Code Playgroud)
根据以上信息,我认为该dll也使用“任何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.
Run Code Online (Sandbox Code Playgroud)
任何与此有关的帮助将不胜感激。
提前致谢。
下面是来自Fusion ..的Assembly Binding Log。根据错误信息的后三行,这似乎是Assembly Platform的问题。但是由于这是第三方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.
Run Code Online (Sandbox Code Playgroud)
如果我将“首选32位”设置为ON,则以上错误将消失。但是,我仍然收到“ FileNotFoundException”,“无法加载文件或程序集'dcasdk.dll”或其依赖项之一。找不到指定的模块。”。但是这次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.
Run Code Online (Sandbox Code Playgroud)
“ 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()
Run Code Online (Sandbox Code Playgroud)
问题并修复:
原来是找不到dcasdk dll依赖项的问题。我确实联系了第三方提供商,他们确认dcasdk dll与另外两个dll有依赖关系(稍后由他们提供),添加后解决了该问题!
感谢大家帮助我理解问题。
当我尝试将其部署为Windows服务器R2上运行的计算机中的Windows服务时,我再次得到FileNotFoundException。
我尝试使用“ Prefer 32”进行编译,从而导致“ BadImageFormatException”。
如果我使用x86平台目标进行编译,尽管服务文件夹中存在所有所需的dll,但我将得到FileNotFoundException。
有人可以帮助我了解部署发生了什么问题。它可以通过“任何CPU,首选32位ON”在开发系统中正常工作。
Fer*_*hez 11
如前所述,这是由于错误的体系结构造成的:a)在Windows x86中使用x64程序集b)在x64进程中使用x86程序集,反之亦然
为了获得最佳结果,请确保所有.NET程序集都使用“任何CPU”和相同的.NET配置文件(即,全部使用.NET Core,客户端配置文件或完整.NET)构建。
...或者根本找不到一个依赖项,请启用Fusion Log告知要在哪里收集程序集:
请参阅如何在.NET 和 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的调用,该dll在运行时失败)。