web-dev-qa-db-ja.com

32ビットDLLのロード時のBadImageFormatException、ターゲットはx86

DLL(FreeType)は32ビットです(ヘッダー:IMAGE_FILE_MACHINE_I386))。

DllImportを使用して、C#コードから使用します。

私のアプリケーションのターゲットはx86、IntPtr.Sizeは4、プロセスは32ビットです。

しかし、BadImageFormatException(HRESULTからの例外:0x8007000B)が発生します。何が悪いのでしょうか?

もちろん、64ビットWindows 7を使用しています。

33
Coder

私が理解していることから、x86用に特別に構築され、64ビットオペレーティングシステムで実行されるアセンブリは、x86用に構築されたライブラリのみをロードできます。そうしないと、BadImageFormatExceptionがスローされます。 64ビットOSでは、任意のCPUまたはx64用に構築されたアセンブリは、x86ライブラリをロードしようとしたときに同じ例外をスローします。

ですから、信じられないほど奇妙なことは何も起きていないと仮定して、プロジェクトのプロパティを開き、[ビルド]タブをクリックして、x86としてビルドするようにアプリケーションを設定したことを確認します。 「プラットフォームターゲット」が「CPU」ではなく「x86」に設定されていることを確認します。

あるいは、テスト目的でDLLの64ビットバージョンを見つけようとすることもできます。

41
Eric Smith

Build-> Platformのオプション "Any CPU"を使用してdllを再コンパイルします。

enter image description here

7
RckLN

OK、誤報のようです。 bitnessとは関係がなく、ただfreetypeが依存する他のDLLがありません。ただし、エラーメッセージの方が役立つ場合があります。

6
Coder

また、Webアプリケーションの場合、IIS 7.で32ビットアプリケーションを実行するように解決する必要があります。 http://www.fishofprey.com/2009/04/badimageformatexception-in- iis-70-on-64.html

4
Anastacia

C#から64ビットC DLLを呼び出すときに同じエラーが発生しました。 C#Properties->Build->Platform targetAny Cpuからx64に手動で変更する必要がありました。どうやらAny Cpuは時々NoCpuです。

4
BSalita

この例外の一般的な原因は、質問が最初に尋ねられてから8年間で変わったと思われます。 VS 2017を使用したセットアップでは、「32ビットを優先」のチェックを外すと問題が解決したことがわかりました:

[ビルドオプション]の[32ビットを優先する]をオフにします

これにより、64ビットDLLがC++から正しくビルドされます。逆に、このオプションをチェックすると、32ビットDLLが正しくロードされます。

2
Caleb

同様のエラーが発生しました。デバッグ用のucrtbase.dllまたはucrtbased.dllとデバッグ用のvcruntime140.dllまたはvcruntime140d.dllを実行可能ファイルのディレクトリに追加することで解決できました。 140は、使用しているVisual Studioのバージョン番号に依存すると思います。

ucrtbase.dllは通常_C:\Windows\System32_にあります。 vcruntime140.dllはC:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x86\vcruntime140.dllにあります

詳細については、こちらをご覧ください: http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx

2
Peter Ittner

c#プロジェクトでプロパティを使用し、「プラットフォームターゲット」をx64に変更します。 ここに画像の説明を入力

1
xuanbka1

Visual Studioでネイティブアプリケーション/ DLLをビルドすると、そのバージョンのVisual Studioの「再配布可能」パッケージに依存します。 msvcr100.dllmsvcp100.dllなどのDLLが含まれています(100のさまざまな値)。

私の場合、ターゲットマシンのWindows/system32ディレクトリにあるこれらのDLLを見ていたので、すべてがうまくいくと思いました。これらのDLLはx64でした! system32というディレクトリに64ビットDLLが含まれている理由がわかりません。そこで、Visual Studio 2010ディレクトリでmsvc*.dllという名前のすべてのものを検索し、msvcr100.dllおよびmsvcp100.dllのx86バージョンを見つけました。それらをターゲットマシン(プログラムのパスからアクセスできる場所)にコピーしましたが、すべてうまくいきました。

これが、Microsoftのまったくの狂気に直面した他の誰かの助けになることを願っています。

1
ulatekh

[プロパティ]-> [ビルド]-> [安全でないコードを許可する]オプションを確認してください。

0
ADM-IT