2010-12-16 19 views
2

私はC++でDLLを使用するため、user32 APIのいくつかのアンマネージ機能にアクセスします(PInvokeは使用できません)それ)。私はx86アーキテクチャ用のアプリケーションとDLLの両方をコンパイルし、Windows 7 32ビットではすべて正常に動作します。問題は、Windows 7の64ビットでは、DLLに依存する機能を使用しようとするとアプリケーションがクラッシュすることです(ただし、すべての機能は正常に動作します)。32ビットシステム用にコンパイルされたC#プログラムとC++ DLLが64ビットシステムでクラッシュする

これは32/64ビットの問題だと思うので、x64アーキテクチャーのDLLを再コンパイルしようとしましたが、今は実行時にx86とx64の間でロードするDLLを選択できます。しかし、DLLに依存する機能を使用しようとするとクラッシュします(これは64ビットDLLを32ビットプログラムにロードしようとすると意味があります)。私はまだx64用のアプリケーションとDLLの両方をコンパイルしようとはしていません。私はそれが動作すると思うが、それは私に2つの異なるインストーラが必要となり、私はそこに行きたくない。どんな手掛かり?

+0

両方ともx86用にコンパイルされている場合、動作するはずです。 64ビットシステムでそれをデバッグして詳細を教えてください。 – Henrik

+0

私がテストに使用した64ビットシステムは、友人のコンピュータでした。それをデバッグするには、Windows 7の64ビットをvmwareまたはvboxにインストールする必要がありますが、セットアップはしばらく時間がかかります。 – Manu

+0

64ビットシステムに32ビットのCRT DLLがありますか? –

答えて

2

アンマネージドコードを使用して相互運用する場合は、.NETアプリケーションを同じサブシステム(32ビットまたは64ビット)で実行する必要があります。あなたがロードしているDLLがx86用であると述べているように、.Netをx86プラットフォーム用にビルドするよう強制します。この設定は、プロジェクトのプロパティの[ビルド]タブにあります。デフォルトは任意のCPUです。アンマネージドDLLと一致するように設定をx86に変更してください.64ビットまたは32ビットOSで実行しても問題ありません。

+0

今週末に試してみましょう。私は64ビットシステムでテストします。ありがとう:) – Manu

+0

さて、そのトリックでした。私は実行可能ファイルがx86としてコンパイルされていると思っていましたが、疑わしいところで実際に "Any CPU"としてコンパイルされていましたが、これが設定パネルのリストに与えられた唯一の選択肢でした。私は、x86とx64の間の選択肢を見つけるために設定を詳しく調べなければなりませんでした。だから私は任意のCPUの代わりにx86を選択し、Windows 7 64ビットでテストすると、プログラムは機能しました! DLL内部の機能が正しく動作していませんが、少なくともプログラムが起動し、エラーメッセージが表示されなくなりました。だから私はこの答えを取るつもりです:)ありがとうナタン! – Manu

関連する問題