2

アンマネージド DLL を参照するマネージド DLL を使用しています。/External/foo/ ディレクトリの下に管理されていない dll を追加し、「出力ディレクトリにコピー」を常に変更しました。

問題は、 dll がoutputDir/External/fooディレクトリにコピーされ、ランタイムがそれを見つけようとすると、次のエラーで失敗することです: 「dll を読み込めません: モジュールが見つかりません」

出力ディレクトリに直接コピーすると、すべてうまくいきます。

出力ディレクトリのサブディレクトリを検索するようにプロジェクトランタイムを設定するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

2

あなたはこれをしたくありません.DLL検索地獄はあなたが避けたいものです. Windows は、どこで DLL を検索するかについて非常に柔軟性がありません。当然のことながら、DLL Hell をいじる必要はありません。アンマネージ DLL の唯一の適切な場所は、EXE と同じディレクトリです。DLL をプロジェクト ディレクトリに格納したくない場合は、DLL を簡単にコピーできるため、xcopy.exe を使用して DLL を出力ディレクトリにコピーするビルド後のイベントが必要になります。

代替案はきれいではありません。この DLL が暗黙的に読み込まれる場合、唯一のオプションは、インストーラーを使用してディレクトリをシステムの PATH 環境変数に追加することです。これは本当に悪い考えです。プログラムが簡単に壊れてしまいます。LoadLibrary または pinvoke 宣言を使用して明示的にロードされている場合は、DLL が必要になる前に Main() メソッドで検索パスを変更できるため、より魅力的なオプションがあります。Environment.SetEnvironmentVariable() を使用するか、SetDllDirectory() を pinvoke して、PATH 環境変数のローカル コピーにパスを追加します。展開の問題もあることに注意してください。誰かがこのサブディレクトリを作成し、ユーザーのマシンに DLL をコピーする必要があります。これを行わないすべての大きな理由。

于 2013-06-14T09:15:06.853 に答える
1

これは、前回のプロジェクトで行ったことです。このアンマネージ dll を出力ディレクトリにコピーするバッチ ファイルを作成します。プログラムがコンパイルされるたびにバッチ ファイルを呼び出します。Config キーを使用して、バッチ ファイルの呼び出しを制御することもできます。そのため、構成キーの値 true/false に基づいて実行されます。これが役立つことを願っています

于 2013-06-14T07:49:06.523 に答える