2

いくつかのマネージドライブラリに依存するアプリがあります。これらのマネージドライブラリは、いくつかのアンマネージドライブラリに依存しています。

XPを実行しているマシンにアプリをデプロイすると、正常に実行されます。Vistaを実行しているマシンで同じことを行うと、DLLが見つからないという例外が発生します。

VS2010セットアッププロジェクトとNSISインストーラーの両方を試して展開を行いましたが、どちらの場合も同じです。

なぜこれが起こるのでしょうか?それを回避するために何ができますか?


更新-詳細

  1. 両方のインストーラーが.NET4.0のインストールを確認し、必要に応じてインストールします。
  2. Vistaコンピューターは64ビットですが、インストールは期待どおりにx86プログラムファイルフォルダーに転送されます
  3. どちらの場合も、私は管理者アカウントを持っています
  4. DLLは、実行可能ファイルと同じディレクトリに保持されます
  5. 私の知る限り、ファイルは正しいディレクトリにコピーされています

アップデート2

  1. 完全なエラーはhttp://pastebin.ca/2046487にあります
  2. DLLはAudiere.Net.dllで、これは私の1つであり、マネージドライブラリです。

そのエラーがAudiere.Net.dllを見つけることができないことを意味するのか、それとも依存関係の1つが見つからないためにロードできないのかはわかりません。


アップデート3-プロセスモニターからのもの

プロセスモニターを実行した後(Mehrdadに感謝します!)、ステータスが「SUCCESS」ではないエントリがいくつかあります。これらのいくつかは「NAMENOTFOUND」であり、いくつかは「PA​​THNOTFOUND」です。(デバッガーでのみ使用されていると思っていたPDBファイルを照会することもあります。)実際の障害につながる可能性のあるエントリを特定するのは非常に困難です。とにかく、誰かにとって何か意味がある場合に備えて、ログをアップロードしました(関連するパスを持つようにフィルタリングされています)。


アップデート4-.pdbファイルを追加

だから私はちょっと必死になって、インストーラーの出力に.pdbファイルを含めました。役に立たないと思いましたが、実際にはもっと便利なエラーになりました。単にDLLが見つからないと言うのではなく、BadImageFormatExceptionが発生するようになりました。これをグーグルで検索すると、これはx86でコンパイルされているがx64で実行されているバイナリの一般的な問題であることがわかります(Vistaマシンの場合と同様)。

推奨される解決策は、x86をターゲットにするように強制することですが、Audiere.Net.dllはすでにそうでした。ラップするライブラリに問題があるのでしょうか?

4

7 に答える 7

2

アプリを目的のフォルダーに実際にインストールできないようなリダイレクトがあるのではないでしょうか?

もう少し詳細が必要ですが、ユーザーまたはマシンのためにインストールしますか? あなたは管理者ですか?DLL は通常どこにありますか?

編集プロセスモニターを使用して、実際にアクセスされているファイルを監視してみてください。

于 2011-04-14T18:02:26.640 に答える
1

Audiere.Net.dll は x86 をターゲットにしているとのことですが、実行可能ファイルについてはどうでしょうか。

もちろん、プログラムを再コンパイルするか、Corflags (フレームワークの一部) を使用して、exe の現在の設定を表示できます。

 Corflags ssd2.exe

または、フラグを設定または設定解除する

 Corflags ssd2.exe /32BIT+ 

 Corflags ssd2.exe /32BIT-

(注意: アプリが厳密な名前で署名されている場合、/Force を使用して署名を削除しない限り、アプリは機能しません)

于 2011-04-20T12:10:58.497 に答える
1

アンマネージ DLL の 1 つを x64 用に再コンパイルする必要がありました。

主な手順:

  • プロセス モニターをチェックして、考えられるエラーの原因を調べます。アプリがクラッシュしたときに Windows が送信するエラー レポートを注意深く見てください。
  • マネージド ライブラリの .pdb ファイルを含めます。これにより、より有益なエラー メッセージが表示されるようです。
  • これらのエラー メッセージは、どのマネージド ライブラリがエラーの原因であるかを特定しただけでなく、それが x86/x64 の問題であることも示していました。( BadImageFormatException)
  • 適切なアドバイスに従って、すべての管理されていないライブラリが x86 をターゲットにしていることを確認してください。(私のものでしたが、確かに良いです。)
  • x64 マシンで、面倒な管理ライブラリの管理されていない依存関係を再コンパイルします。
  • 適切な (x86 または x64) バージョンの DLL をコピーするインストール スクリプトを記述します。
  • 利益!

仕様:

  • 私が抱えていた問題は にあるように見えましたがAudiere.Net.dll、実際には の問題が原因でしたlibaudieresharpglue.dll
  • インストーラーには NSIS を使用しています。アーキテクチャ固有の DLL を実現するために、x64.nshというヘッダーを使用しました。
于 2011-04-20T19:02:17.843 に答える
1

.Net アプリケーションを実行している場合、両方のコンピューターに適切なフレームワークがインストールされていますか?

于 2011-04-14T18:05:44.813 に答える
0

SQLite ラッパーで同様の問題に遭遇したことを思い出します。もちろん、問題の原因は 32/64 ビットの問題であり、SQLite ラッパーがプロセッサに依存するマネージド ラッパーであるのと同じシナリオです。

管理されているライブラリ(Audiere.Net.dll)は32ビット用にコンパイルされていますが、メインアプリケーション(ssd2.exe)はそうではないと推測しています。

インストール フォルダーはセットアップの構成によって決定されますが、アプリケーション プロジェクトが x86 プロジェクトとしてコンパイルするように厳密に構成されていない場合 (通常は既定のAny Cpu環境をターゲットにします)、アプリケーションは 64 ビット プロセスとして起動します。インストール パス。これは、64 ビット マシンのタスク マネージャーでプロセスを確認することで簡単に確認できます。64 ビット Windows マシンでは、すべての 32 ビット プロセスに *32 が追加されています (32 ビット マシンにはありません)。

編集:または、プロジェクトのプロパティを見ることでより簡単に->ビルド->プラットフォームターゲット:)

とにかく、ssd2.exe をビルドするプロジェクトのプロジェクト設定を x86 をターゲットに変更する必要があります。

于 2011-04-19T23:33:06.613 に答える
0

通常の理由は、問題の dll が、Vista マシン上にない (またはおそらくそこにあるが登録されていない) 他の dll に依存していることです。

于 2011-04-14T18:16:24.493 に答える
0

私たちは似たようなことに遭遇し、サードパーティの dllを使用して Windows 7 でプログラムを実行するには 、 c++ Redistibuatable Packageをダウンロードする必要があることがわかりました。

于 2011-04-19T18:54:52.160 に答える