「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」で期待どおりに開発システムで動作します。
すでに述べたように、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を開く呼び出しを確認できます) )。