Невозможно загрузить 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 ]

2 голосов
/ 22 сентября 2014

Убедитесь, что для Build Platform Target установлено значение x86 или x64, чтобы оно было совместимо с вашей DLL - что может быть скомпилировано для 32-разрядной платформы.

1 голос
/ 22 февраля 2019

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

Именно это и произошло в моем случаеНадеюсь, это поможет кому-то еще.

1 голос
/ 25 января 2018

Я столкнулся с той же проблемой, в моем случае у меня было два 32-битных ПК. Один с установленным .NET4.5, а другой был свежим ПК.

мой 32-битный cpp dll (сборка в режиме выпуска) работал нормально с установленным ПК .NET, но не со свежим ПК, где я получил ошибку ниже

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

наконец,

Я только что построил свой проект в режиме отладки конфигурации и на этот раз мой cpp dll работал нормально.

1 голос
/ 20 октября 2016

Настройка : 32-разрядная ОС Windows 7

Контекст : Установлен драйвер PCI-GPIB, через который я не смог установить связь из-за вышеупомянутой проблемы.

Краткий ответ : переустановите драйвер.

Длинный ответ : Я также использовал Зависимость Walker , которая выявила несколько отсутствующих зависимостеймодули.Сразу я подумал, что это, должно быть, была неудачная установка драйвера.Я не хотел проверять и восстанавливать каждый отсутствующий файл.

Тот факт, что мне не удалось найти деинсталлятор в разделе «Программы и компоненты панели управления», является еще одним показателем плохой установки.Мне пришлось вручную удалить несколько файлов * .dll в \ system32 и разделах реестра, чтобы можно было переустановить драйвер.

Исправлена ​​ошибка.

Неожиданным было то, что не все модули зависимости былирешена.Тем не менее, на интересующий * .dll теперь можно ссылаться.

0 голосов
/ 17 января 2019

Также столкнулся с той же проблемой при использовании неуправляемого файла dll c / c ++ в среде c #.

1.Проверена совместимость dll с 32-битным или 64-битным процессором.

2.Проверены правильные пути к папке DLL .bin, system32 / sysWOW64 или указанному пути.

3.Проверено, отсутствуют ли файлы PDB (база данных программ). Это видео дает вам лучшее понять о файлах pdb.

При запуске 32-битного двоичного кода C / C ++ в 64-битной системе это может произойти из-за несовместимости платформы. Вы можете изменить его из Build> Configuration manager.

0 голосов
/ 27 мая 2015

Я думаю, что вашей неуправляемой библиотеке нужен манифест.
Здесь - как добавить его в бинарный файл. и здесь - вот почему.

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

...