Исключение DllNotFoundException с HRESULT 0x8007007E при загрузке 64-битной dll

я скачал zlibи скомпилировал библиотеку как dll для 32-битной и 64-битной Windows. Теперь у меня есть zlibwapi.dllи zlibwapi64.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. У меня установлены среды выполнения VS2008 C++, как 32-битные, так и 64-битные.
  • Когда я пытаюсь загрузить zlibwapi64.dll из неуправляемого приложения C++, он загружается без проблем. Это С#, который не может его загрузить.

Я пытался установить абсолютный путь к 64-битной dll, это не помогает.

Как заставить это работать?

7
задан GSerg 27 May 2012 в 13:13
поделиться