У меня есть сторонняя DLL для интеграции с их приложением. Это 32-битная C ++ DLL, которая не предоставляет себя через COM, и мне не был предоставлен исходный код или файл заголовка.
Он был снабжен рабочим примером кода VB.NET в примере WinForms. Это работает, если исполняемый файл запускается из того же каталога, что и API-библиотека API, и приложения, для которого интерфейс API.
Я использовал пример объявления функции:
Declare Ansi Function GetVersion Lib "ThirdPartyAPI.dll" () As Integer
Однако мы будем использовать вызовы API из библиотеки C # для использования на веб-сайте или в веб-службе, поэтому я преобразовал пример кода VB в
[DllImport("ThirdPartyAPI.dll", SetLastError = true, CharSet = CharSet.Ansi)]
public static extern int GetVersion();
Если я вызываю это из библиотеки C #, я получаю сообщение об ошибке
Unhandled Exception: System.DllNotFoundException: Unable to load DLL
'ThirdPartyAPI.dll': A dynamic link library (DLL) initialization
routine failed. (Exception from HRESULT: 0x8007045A)
Я выбрал альтернативный путь и поместил исходный рабочий код VB из примера в его собственную библиотеку VB.NET DLL и назвал его через C #. Я получил ту же ошибку. Странно, но вызов VB.NET DLL из консольного приложения VB.NET работает.
В итоге:
Я создал хост WCF через службу NT для предоставления функций, надеясь, что это будет работать вокруг расположения файлов и зависимостей. Это было написано в VB.NET и помещено в ту же папку, что и ThirdPartyApi.dll.
Обратите внимание, что во всех вышеперечисленных случаях исполняемые файлы находятся в том же каталоге, что и ThirdPartyApi.dll. Все его зависимости также существуют в этом каталоге.
Может кто-нибудь объяснить это поведение или предложить, как это можно сделать для работы на веб-сайте C #?
Спасибо
Код ошибки 0x8007045A
, Это код ошибки COM, который сопоставляется с кодом ошибки Win32. ERROR_DLL_INIT_FAILED
, Который описывается как:
Сбой процедуры инициализации библиотеки динамических ссылок (DLL).
Это означает, что ваша DLL была найдена, несмотря на возможно вводящий в заблуждение класс исключения DllNotFoundException
, Однако DLL не удалось загрузить. Вы не можете получить больше информации из системы. У DLL нет механизма сообщения о причинах, по которым ее не удалось загрузить. Я предлагаю вам связаться с поставщиком DLL и попросить поддержки.