2012-02-25 20 views
2

私はx86コードとしてコンパイルするアプリケーションを持っていますが、別のバージョンとしてx64コードとしてもコンパイルできます。アプリケーションは、基本的にc#managed exeとC++ unmanaged dllの2つの部分を持っています。私は後者に問題があります。私の開発PC(Windows 7 64-bit、Visual Studio 2008)では、デプロイメントプロジェクトを使ってセットアップを作成します。このセットアップでは、アプリケーションをProgram Filesにインストールします。私もテスト用のPC(Windows 7 64-bit)を持っています。アプリケーションはまだProgram Files ...にインストールされますが、実行されません。管理されていないDLLの関数(関数)が呼び出されるとBadImageFormatExceptionが発生します。問題は、dllを生成する私自身のプロジェクトもかなり自由に利用できるいくつかのライブラリ(glew32、openal、freeimageなど)を利用していることです。これらのx64バージョンまだ何かが間違っていなければなりません。何らかの理由で、私のDLLで使用されているライブラリの1つがテスト用のPC上でx64コードとして利用できませんが、開発用PCにあります。少なくとも、セットアップPCが開発用PCで動作し、テスト用PCでは動作しない唯一の説明です。 私の質問は:どのようにして問題がどこにあるかを知ることができます。私が受け取ったエラーメッセージは、役に立つ情報を教えてくれません。私は依存して私のDLLを分析しようとしましたが、それはOKのように見えます。それはX86として多くの依存ライブラリをリストしています(これらはおそらくシステムファイルです)が、私が意図的に使うものはすべてx64としてリストされています。 テスト用PC上のWindowsがx64でなければならないのに、x86コードとしてDLLを実行しようとする理由をテストする方法はありますか?おかげさまで ネイティブx64 dllが動作しません

非常に奇妙なことに気付きました。私のアプリケーションは、x64アプリケーションのためにProgram Filesフォルダに展開されていますが、実行に失敗しています。しかし、インストールされているフォルダ内のすべてのファイルを別のフォルダ(Documentsフォルダ内)にコピーすると、アプリケーションは完全に実行されます。

+2

SysInternalsのProcMonユーティリティを使用して、見つかったDLLを正確に確認します。 –

答えて

0

問題を診断するマシンでFusion Log Viewerを実行してください。ログを注意深く見て、どのDLLがロードされているのか、どのDLLからロードされているのかを正確に確認します。

+0

これは.NETアセンブリのためだと思いますが、問題はアンマネージドdllです。それにもかかわらず、私は融合ログビューアを試しましたが、リストにはエントリがありません。 – aronsatie

+0

これはネイティブdllもカバーしていますので、設定を微調整する必要があります。私はまた、混合されたソリューションを持っており、これを過去に成功裏に使用しました。また、バインドの失敗を記録するように指示する必要があります。私はすぐにそれについてブログの投稿をするかもしれません。 –

+0

設定を微調整する方法を詳しく教えてください。ありがとう。 – aronsatie

0

Any CPU構成の.NET実行可能ファイル(またはDLL)をビルドし、Win32/x64用のx64/Win32ネイティブDLL(つまり、間違った設定)を指定しました。

  • x64システムでは、.NETバイナリはネイティブDLLをネイティブDLLがx64であるかのようにロードしようとします。
  • 32ビットシステムでは、32ビットのネイティブDLLをロードしようとします。
+0

いいえ、私は両方のc#exeとアンマネージドC++ dllをx64として構築しました。 – aronsatie

0

回答が見つかりました。問題は64ビットdllではありませんでした。私が作っていないライブラリの一つですが、私はリンクしています(私はまだそこにはいません)がアプリケーションフォルダにファイルを書き込もうとしているようです。もちろん、管理者としてアプリケーションを実行しない限り、これはProgram Filesフォルダ内では許可されません。間違った質問のために助けを求めて申し訳ありません。

関連する問題