DllNotFoundException из C #, но не VB.NET

У меня есть сторонняя 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 работает.

В итоге:

  • Будет работать простое консольное приложение VB.NET
  • Будет работать простое приложение VB.NET WinForms
  • Простое консольное приложение VB.NET может вызывать GetVersion через VB.NET DLL
  • Простое консольное приложение C # не может вызывать GetVersion через VB.NET DLL
  • Простое консольное приложение C # не может напрямую вызывать GetVersion.
    Это может быть связано с неправильным определением вызовов функций. В
    на этом этапе я не слишком беспокоюсь об этом.
  • 32-битная компиляция не решает проблему
  • Я пробовал это на Server 2008 R2 и Windows 7 Enterprise

Я создал хост WCF через службу NT для предоставления функций, надеясь, что это будет работать вокруг расположения файлов и зависимостей. Это было написано в VB.NET и помещено в ту же папку, что и ThirdPartyApi.dll.

  • Ни один код из службы NT не может получить доступ к GetVersion
  • Ни один код из службы WCF не может получить доступ к GetVersion

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

Может кто-нибудь объяснить это поведение или предложить, как это можно сделать для работы на веб-сайте C #?

Спасибо

0

Решение

Код ошибки 0x8007045A, Это код ошибки COM, который сопоставляется с кодом ошибки Win32. ERROR_DLL_INIT_FAILED, Который описывается как:

Сбой процедуры инициализации библиотеки динамических ссылок (DLL).

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

0

Другие решения


По вопросам рекламы [email protected]