簡體   English   中英

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

我收到以下運行時錯誤,我的控制台應用程序(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 也是使用“任何 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,我無法將其重新編譯到任何特定平台。 請分享您對這里可以做什么的想法..

請注意,我在 Windows7、64 位操作系統上運行此控制台應用程序。

*** 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’或其依賴項之一。找不到指定的模塊。”。 但是這次 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 服務器 R2 上運行的機器中的 Windows 服務時,我再次收到 FileNotFoundException。

我嘗試使用“Prefer 32”進行編譯,結果導致“BadImageFormatException”。

如果我使用 x86 平台目標進行編譯,我會收到 FileNotFoundException,盡管所有需要的 dll 都存在於服務文件夾中。

有人可以幫助我了解部署出了什么問題。 它在“任何 CPU,首選 32 位開啟”的情況下按預期在開發系統中工作。

如前所述,這是由於錯誤的體系結構 a) 在 Windows x86 中使用 x64 程序集 b) 在 x64 進程中使用 x86 程序集,反之亦然

為獲得最佳結果,請確保所有 .NET 程序集都使用“任何 CPU”和相同的 .NET 配置文件構建(即全部使用 .NET Core、客戶端配置文件或完整的 .NET)。

...或者根本沒有找到一個依賴項,啟用 Fusion Log 來告訴在哪里尋找收集程序集:

請參閱如何在 .NEThttp://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx 中啟用程序集綁定失敗日志記錄(Fusion)

更新:鑒於錯誤代碼 0x8007000b,我很確定是架構不匹配:a) dll 可能是完整的 .NET 代碼,但不是用 AnyCPU 編譯的 b) dll 可能是本機代碼,然后你需要一個匹配的架構(加上有些人使用 PInvoke 調用其代碼) c) dll 可能是 C++ CLI(本機/.NET 代碼的混合,同樣具有錯誤的架構)。 d) dll 可能已損壞。

您可能需要聯系第 3 方提供商以獲得支持。 此外,此鏈接提到它可能與 .NET 版本不匹配。

無論如何,看起來問題縮小了。

此外,如果 DLL 部分是本機的,它可能需要 MSVC 運行時(正如這個問題的答案所提到的, 在 64 位系統上使用 32 位 dll 顯示 0x8007000B 錯誤

在這種情況下,問題將是找不到 dcasdk 的依賴項。 您可以檢查哪個 Dependency Walker,請參閱http://www.dependencywalker.com/ (它還有一個配置文件模式,您可以在其中配置一個 exe,並查看打開在運行時失敗的 dll 的調用)。

在 VS 中,轉到tools ,然后單擊options

在搜索欄中搜索“iis”並選中此選項,然后運行該項目,這對我有用,因為我在 Web 項目中遇到錯誤。

**在此處輸入圖片描述**

右鍵單擊項目設置,然后單擊構建並將平台目標從 Any 設置為 x64 或 x86 ,根據您的 dll 設置。

對我來說,我試圖用 AnyCpu 設置加載 x64 dll。 我將 AnyCpu 設置更改為 x64,它開始為我工作。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM