質問
私はC / C ++で書かれて管理されていない32ビットライブラリを使用するC#(。NET 3.5、VS2005プロフェッショナル)アプリケーションを持っています。私が使用するAPIは、このようなものです。
void *型の初期化(int型x)は;
VOICのGetData(void *型);
そして、私は、Windows XP 32ビット上でそれを実行したときに、これは動作しますが、Windows上で、それは例外をスローXP64bitます:
未処理の例外:System.Reflection.TargetInvocationException:呼び出しのターゲットが例外をスローされました。 ---> System.BadImageFormatException:試みは間違ったフォーマットのプログラムをロードするために作られました。 (HRESULTからの例外:0x8007000B) Aktuelizator.CommonLibrary.InitializeRingBufferで(のInt32 DIM) Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctorで()
64ビットXPの下でこれらの管理されていないDLLの仕事のC / C ++での32ビット非管理アプリケーションwritetnから呼び出されたときます。
誰もが任意のアイデアを持っていますか?
解決
あなたのビルド構成プラットフォームは、それが64ビットとして実行され、64ビットのOS上で意味「は任意のCPU」に設定されている、あなたは、DLLをロードすることはできません。 x86の代わりにそれを設定し、これはOSに関係なく、32ビットとして実行することを強制されますし、あなたのdllは罰金ロードされます。
他のヒント
あなたのDLLは、32ビットにコンパイルされるように聞こえるが、あなたは32ビットおよび64ビットプロセスの両方からそれを呼び出すようにしてみてください。前者はもちろん、動作します。後で、しかし、ではないでしょう。 32ビットDLLは、32ビットプロセスで使用することができます。 64ビットターゲットにDLLをコンパイルしてみて、C#のアプリはそのいずれかを使用してみましょう。
実際にのIntPtrれるべきであること、のInt32として定義されているすべてのパラメータをチェックします。