7

zlibをダウンロードし、ライブラリを Windows 32 ビットと Windows 64 ビットの両方の dll としてコンパイルしました。私は今持っていますzlibwapi.dllzlibwapi64.dll.

dll はアプリケーション フォルダーにコピーされ、次のように参照されます。

[DllImport(@"zlibwapi.dll",   EntryPoint = "uncompress", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)]
private static extern int uncompress32(
    IntPtr dest,
    ref uint destLen,
    [In(), MarshalAs(UnmanagedType.LPArray)] byte[] source,
    uint sourceLen
);

[DllImport(@"zlibwapi64.dll", EntryPoint = "uncompress", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)]
private static extern int uncompress64(
    IntPtr dest,
    ref uint destLen,
    [In(), MarshalAs(UnmanagedType.LPArray)] byte[] source,
    uint sourceLen
);

実行時に、自分が 32 ビットか 64 ビットかを確認し、適切なバージョンを呼び出します。

32ビットの場合、これは正常に機能しますが、64ビットバージョンでは

DLL "zlibwapi64.dll" を読み込めません: モジュールが見つかりません。(HRESULT 例外: 0x8007007E)

インターネットで同様の質問をたくさん見つけましたが、その理由は、ライブラリが他のいくつかのライブラリに依存しており、それらのライブラリが見つからない可能性があるためです。
これは当てはまらないようです:

  • zlibwapi64.dll は、Kernel32.dll と MSVCR90.dll のみに依存します。32 ビットと 64 ビットの両方の VS2008 C++ ランタイムがインストールされています。
  • 管理されていない C++ アプリケーションから zlibwapi64.dll を読み込もうとすると、問題なく読み込まれます。ロードに失敗するのは C# です。

64 ビット dll への絶対パスを設定しようとしましたが、役に立ちません。

どうすれば機能しますか?

4

2 に答える 2

12

これはかなり基本的な「ファイルが見つかりません」の種類のエラーですが、残念ながら、見つからなかった DLL を明示的に示していません。依存 DLL の問題については既にご存じでしょう。/MT を使用してコードをコンパイルすることにより、msvcr90.dll への厄介な依存関係を回避できることに注意してください。

問題をデバッグする必要があり、DLL を探している場所を把握する必要があります。良いツールの 1 つにSysInternals の ProcMon ユーティリティがあります。これは、プログラムがファイルを探している場所を正確に示します。DLL をプローブし、PATH のディレクトリを検索し、ファイルが見つからないことがわかります。

残念ながら、ProcMon は少しおしゃべりで、データに夢中になる癖があります。より専用のツールは GFlags.exe で、Debugging Tools for Windows パッケージから入手できるツールです。最近では、Windows SDK に含まれています。インストール後、c:\program files (x86)\debugging tools for windows\gflags.exe に保存されます。「ローダースナップを表示」オプションをオンにすることができます。それ以降の Windows バージョンでは、Windows ローダーが DLL を検索しているときにデバッグ メッセージを生成するように指示します。アンマネージ デバッグを有効にすると、出力ウィンドウに表示されます。

最初に ProcMon を試してみてください。

そしてもちろん、この種のインストールの問題と戦わないように、純粋なマネージド ソリューションを検討してください。良いものは DotNetZip と SharpZipLib で、最初の Google ヒットを取得します。

于 2012-05-27T13:50:09.773 に答える
3

Another good tool for examining Dll dependencies is Dependency walker (depends). It looks at the file in a static way so a little easier than using process monitor.

http://www.dependencywalker.com/

于 2012-05-27T14:25:14.700 に答える