DLL(FreeType)は32ビットです(ヘッダー:IMAGE_FILE_MACHINE_I386))。
DllImportを使用して、C#コードから使用します。
私のアプリケーションのターゲットはx86、IntPtr.Sizeは4、プロセスは32ビットです。
しかし、BadImageFormatException(HRESULTからの例外:0x8007000B)が発生します。何が悪いのでしょうか?
もちろん、64ビットWindows 7を使用しています。
私が理解していることから、x86用に特別に構築され、64ビットオペレーティングシステムで実行されるアセンブリは、x86用に構築されたライブラリのみをロードできます。そうしないと、BadImageFormatExceptionがスローされます。 64ビットOSでは、任意のCPUまたはx64用に構築されたアセンブリは、x86ライブラリをロードしようとしたときに同じ例外をスローします。
ですから、信じられないほど奇妙なことは何も起きていないと仮定して、プロジェクトのプロパティを開き、[ビルド]タブをクリックして、x86としてビルドするようにアプリケーションを設定したことを確認します。 「プラットフォームターゲット」が「CPU」ではなく「x86」に設定されていることを確認します。
あるいは、テスト目的でDLLの64ビットバージョンを見つけようとすることもできます。
Build-> Platformのオプション "Any CPU"を使用してdllを再コンパイルします。
OK、誤報のようです。 bitnessとは関係がなく、ただfreetypeが依存する他のDLLがありません。ただし、エラーメッセージの方が役立つ場合があります。
また、Webアプリケーションの場合、IIS 7.で32ビットアプリケーションを実行するように解決する必要があります。 http://www.fishofprey.com/2009/04/badimageformatexception-in- iis-70-on-64.html
C#から64ビットC DLLを呼び出すときに同じエラーが発生しました。 C#Properties->Build->Platform target
をAny Cpu
からx64
に手動で変更する必要がありました。どうやらAny Cpu
は時々NoCpuです。
この例外の一般的な原因は、質問が最初に尋ねられてから8年間で変わったと思われます。 VS 2017を使用したセットアップでは、「32ビットを優先」のチェックを外すと問題が解決したことがわかりました:
[ビルドオプション]の[32ビットを優先する]をオフにします
これにより、64ビットDLLがC++から正しくビルドされます。逆に、このオプションをチェックすると、32ビットDLLが正しくロードされます。
同様のエラーが発生しました。デバッグ用の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
c#プロジェクトでプロパティを使用し、「プラットフォームターゲット」をx64に変更します。 ここに画像の説明を入力
Visual Studioでネイティブアプリケーション/ DLLをビルドすると、そのバージョンのVisual Studioの「再配布可能」パッケージに依存します。 msvcr100.dll
やmsvcp100.dll
などのDLLが含まれています(100のさまざまな値)。
私の場合、ターゲットマシンのWindows/system32
ディレクトリにあるこれらのDLLを見ていたので、すべてがうまくいくと思いました。これらのDLLはx64でした! system32
というディレクトリに64ビットDLLが含まれている理由がわかりません。そこで、Visual Studio 2010ディレクトリでmsvc*.dll
という名前のすべてのものを検索し、msvcr100.dll
およびmsvcp100.dll
のx86バージョンを見つけました。それらをターゲットマシン(プログラムのパスからアクセスできる場所)にコピーしましたが、すべてうまくいきました。
これが、Microsoftのまったくの狂気に直面した他の誰かの助けになることを願っています。
[プロパティ]-> [ビルド]-> [安全でないコードを許可する]オプションを確認してください。