2017-09-06 20 views
0

私たちはC#アプリケーションを持っていて、それはAnyCPUとしてコンパイルされています。 このアプリケーションは、外部DLLにいくつかのC++ライブラリをロードする外部ライブラリ(AnyCPU上の.Net DLL)も使用します。0x8007000B例外をデバッグする方法は?

外部ライブラリは、X86、X64のいずれかです。ポストビルドイベントがあり、そのイベントはX64から出力フォルダにコピーされます。

私たちは何年も働いていましたが、このライブラリを使用して単体テストをたくさんしています。

最近、1台のコンピュータ(ビルドマシン)でUnitTestsが失敗し、次のコールスタックが発生します。私たちは、C++ DLLを確認しました

The type initializer for 'Dew.Math.Units.MtxParseClass' threw an exception. 
    at System.Runtime.CompilerServices.RuntimeHelpers._RunClassConstructor(RuntimeType type) 
    at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type) 
    at Dew.Math.TExprContext..cctor() 

The type initializer for 'Dew.Math.Units.MtxVec' threw an exception. 
    at System.Runtime.CompilerServices.RuntimeHelpers._RunClassConstructor(RuntimeType type) 
    at System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type) 
    at Dew.Math.Units.MtxParseClass..cctor() 

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 
    at Dew.Math.Units.Nmkl.kmp_set_blocktime(Int32 Value) 
    at Dew.Math.TMtxVecController..ctor() 
    at Dew.Math.Units.MtxVec.InitializeMtxVec() 
    at Dew.Math.Units.MtxVec.Dew.Math.MtxVec() 
    at Dew.Math.Units.MtxVec..cctor() 

は、私たちのアプリケーションが64ビットコンピュータでAnyCPUであり、64ビットであるので、通常、我々はthosesエラーを持つべきではありません。

奇妙な部分は次のとおりです。私たちは何かのテストにもテストされたクラスにも触れていませんでした。テストは他のすべてのコンピュータで正常に動作します。

だから私の質問:それをデバッグする方法

  • 我々はX64で実行されていることを確認するためにどのよう
  • ロードされて失敗したDLLの正確なパスを知る方法とx86ではなく?
  • この問題のトラブルシューティングに役立つ他のアイデアはありますか?
+1

これは常に32/64ビットの不一致です。 DLLが64ビットの場合、.netコードはAnyCPUではなく64ビットをターゲットにする必要があります。 –

+0

@DavidHeffernan 1)私はこれが32/64の不一致であることを知っています。私はWHYを理解しようとしています。 2)私は同意しない。 AnyCPU DLLを作成すると、64ビットまたは32ビットの実行可能ファイルでこのDLLを使用できます。あなたが指摘している質問は、外部ライブラリによってどのDLLがロードされているかを知る方法を知らない。 – J4N

+0

ターゲットを64ビットに変更すると、同じ障害が発生しますか? –

答えて

0

x64でAnyCPUを使用すると、32ビットが優先されます。プロジェクトのビルド設定でこれを変更できます

+0

このオプションを見ましたが、実行可能ファイルの場合のみです。ライブラリと単体テストの場合は指定できません。 – J4N

+0

@ J4N:はい、もちろんです。アプリケーションは、コンテキスト内で実行されているすべての処理のビット数を決定します。 –

関連する問題