web-dev-qa-db-ja.com

BadImageFormatExceptionファイルまたはアセンブリ、またはその依存関係の1つをロードできませんでした。不正な形式でプログラムをロードしようとしました

「dcasdk.dll」を参照するコンソールアプリケーション(VS2012)で、次のランタイムエラーが発生します。コンソールアプリの.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.

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からのアセンブリバインディングログです。エラー情報の最後の3行によると、これはアセンブリプラットフォームの問題のようです。しかし、これはサードパーティの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.

「32ビットを優先」をオンに設定すると、上記のエラーが消えます。ただし、「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」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がさらに2つのdll(後で提供された)と依存関係を持っていることを確認しました。これは追加後に問題を解決しました!

問題を理解するのを手伝ってくれてありがとう。


これをWindowsサーバーR2で実行されているマシンのWindowsサービスとして展開しようとすると、FileNotFoundExceptionが再度発生します。

「Prefer 32」でコンパイルしようとすると、「BadImageFormatException」が発生しました。

X86プラットフォームターゲットを使用してコンパイルすると、FileNotFoundExceptionが発生しますが、必要なすべてのdllがサービスフォルダーに存在します。

展開の問題を誰かが理解するのを手伝ってもらえますか「Any CPU、Prefer 32bit ON」で期待どおりに開発システムで動作します。

5
SSQs

すでに述べたように、a)Windows x86でx64アセンブリを使用するb)x64プロセスでx86アセンブリを使用する、またはその逆

最良の結果を得るには、すべての.NETアセンブリが「任意のCPU」と同じ.NETプロファイル(つまり、すべてが.NET Core、またはClient ProfileまたはFull .NETを使用)で構築されていることを確認してください。

...または、1つの依存関係がまったく見つからない場合、Fusion Logを有効にして、アセンブリの収集先を確認します。

。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を開く呼び出しを確認できます) )。

VSで、toolsに移動し、optionsをクリックします。

検索バーで「iis」を検索し、このオプションをチェックして、プロジェクトを実行します。これは、Webプロジェクトでエラーが発生したために機能しています。

**enter image description here**

0
Muhammad Bilal