Невозможно загрузить DLL (модуль не найден. HRESULT: 0x8007007E) - PullRequest
100 голосов
/ 25 января 2012

У меня есть библиотека dll с неуправляемым кодом C ++ API, который мне нужно использовать в моем приложении .NET 4.0. Но каждый метод, который я пытаюсь загрузить свою DLL, я получаю сообщение об ошибке:

Невозможно загрузить DLL «MyOwn.dll»: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)

Я прочитал и попробовал несколько решений, которые нашел в интернете. Ничего не работает ..

Я пытался использовать следующие методы:

[DllImport("MyOwn.dll",  CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
    string WorkDirectory, ref StringBuilder ErrorMessage);

Когда я пытался следовать этой статье , и когда я запускаю этот пример (из загруженного кода), он работает без проблем (используемая dll находится в папке bin / debug)

Я скопировал свою dll (вместе со всеми файлами, от которых она зависит, в папку bin).

Я также попробовал этот подход, но получил ту же ошибку:

[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern  int MyproIni(string DBname, string DBuser_pass, 
    string WorkDirectory, ref StringBuilder ErrorMessage);

Есть предложения?

Ответы [ 16 ]

86 голосов
/ 25 января 2012

Из того, что я помню в Windows, порядок поиска для dll:

  1. Текущий каталог
  2. Системная папка, C:\windows\system32 or c:\windows\SysWOW64 (для 32-битного процесса на 64-битномbox).
  3. Чтение из переменной окружения Path

Кроме того, я бы проверил зависимости DLL, здесь вам может помочь средство обхода зависимостей, поставляемое с Visual Studio., его также можно скачать бесплатно: http://www.dependencywalker.com

37 голосов
/ 05 сентября 2014

Вы можете использовать утилиту dumpbin, чтобы узнать необходимые зависимости DLL:

dumpbin /DEPENDENTS my.dll

Это скажет вам, какие библиотеки DLL нужно загрузить. Особенно обратите внимание на MSVCR * .dll. Я видел ваш код ошибки, когда не установлен правильный распространяемый Visual C ++.

Вы можете получить «распространяемые пакеты Visual C ++ для Visual Studio 2013» на веб-сайте Microsoft. Он устанавливает c: \ windows \ system32 \ MSVCR120.dll

В имени файла 120 = 12.0 = Visual Studio 2013.

Будьте внимательны, чтобы у вас была правильная архитектура Visual Studio (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013 ...) для целевой платформы вашей DLL, а также вам нужно Будьте осторожны с отладочными сборками. Отладочная сборка DLL зависит от MSVCR120d.dll, которая является отладочной версией библиотеки, которая устанавливается вместе с Visual Studio, но не распространяется с помощью распространяемого пакета.

11 голосов
/ 25 января 2012

Попробуйте ввести полный путь к DLL. Если это не работает, попробуйте скопировать dll в папку system32.

10 голосов
/ 04 марта 2016

DLL должна находиться в папке bin.

В Visual Studio я добавляю dll в свой проект (НЕ в ссылках, а "Добавить существующий файл"). Затем установите для свойства «Копировать в выходной каталог» для dll значение «Копировать, если новее».

5 голосов
/ 14 сентября 2017

Это 'kludge' , но , вы можете по крайней мере использовать его для проверки работоспособности: попробуйте жестко запрограммировать путь к DLL в вашем коде

[DllImport(@"C:\\mycompany\\MyDLL.dll")]

Сказавтот;в моем случае запуск dumpbin /DEPENDENTS, как предложено @ anthony-hayward, и копирование 32-битных версий библиотек DLL, перечисленных там, в мой рабочий каталог, решили эту проблему для меня.

сообщение просто немного вводит в заблуждение, потому что это не «моя» dll, которая не может быть загружена - это зависимости

4 голосов
/ 17 января 2017

Есть одна очень забавная вещь (и имеет техническое значение), которая может потратить впустую ваши часы, поэтому подумайте о том, чтобы поделиться ею здесь -

Я создал проект консольного приложения ConsoleApplication1 и проект библиотеки классов ClassLibrary1.

Весь код, который делал p / invoke, присутствовал в ClassLibrary1.dll. Поэтому перед отладкой приложения из Visual Studio я просто скопировал неуправляемую сборку C ++ (myUnmanagedFunctions.dll) в каталог \bin\debug\ проекта ClassLibrary1, чтобы он мог быть загружен во время выполнения CLR.

Я продолжал получать

Невозможно загрузить DLL

ошибка по часам. Позже я понял, что все такие неуправляемые сборки, которые должны быть загружены, должны быть скопированы в каталог \bin\debug начального проекта ConsoleApplication1, который обычно представляет собой win-форму, консоль или веб-приложение.

Поэтому, пожалуйста, будьте осторожны, Current Directory в принятом ответе фактически означает Current Directory основного исполняемого файла, с которого начинается процесс приложения. Выглядит как очевидная вещь, но иногда может быть и не так.

Извлеченный урок - Всегда помещайте неуправляемые библиотеки в один каталог с исполняемым файлом запуска, чтобы его можно было найти.

4 голосов
/ 25 января 2012

Убедитесь, что все зависимости вашей собственной dll присутствуют рядом с dll или в System32.

3 голосов
/ 25 января 2012

Включите ведение журнала Fusion, см. этот вопрос , чтобы получить множество советов о том, как это сделатьОтладка проблем с загрузкой приложений в смешанном режиме может быть настоящей королевской болью.Регистрация фьюжн может быть большой помощью.

2 голосов
/ 01 февраля 2016

У меня была такая же проблема при развертывании приложения для тестирования ПК. Проблема заключалась в том, что ПК для разработки имел msvcp110d.dll и msvcr110d.dll, но не тестовый ПК.

Я добавил модуль слияния «Visual Studio C ++ 11.0 DebugCRT (x86)» в InstalledSheild, и он работал. Надеюсь, это будет полезно для кого-то еще.

2 голосов
/ 18 декабря 2014

Если проекты DLL и .NET находятся в одном решении, и вы хотите каждый раз компилировать и запускать их, вы можете щелкнуть правой кнопкой мыши свойства проекта .NET, События Build, а затем добавить что-то вроде следующего в Post -встроить командную строку события:

copy $(SolutionDir)Debug\MyOwn.dll .

Это, в основном, строка DOS, и вы можете настроить ее в зависимости от того, куда строится ваша DLL.

...