Почему загрузка DLL SAP Hana DB ADO.NET может завершиться неудачно? - PullRequest
0 голосов
/ 25 мая 2019

Для приложения .Net C #, которое использует SAP.DATA.HANA.v4.5 v2.3.119 и установлено на машине времени выполнения с libadonetHDB.dll v2.3.119 с переменной среды HDBADONET, указывающей на папку приложения, в которой существует libadonetHDB.dll.Приложение работает, как и ожидалось, на нескольких установках, однако одна новая установка, которую я вижу, не может создать Указанный модуль не может быть найден Ошибка исключение из HanaConnection ниже:

The type initializer for 'Sap.Data.Hana.HanaConnection' threw an exception.
System.Exception: The specified module could not be found
   at Sap.Data.Hana.HanaUnmanagedDll.LoadDll(String dllPath)
   at Sap.Data.Hana.HanaUnmanagedDll..ctor()
   at Sap.Data.Hana.HanaUnmanagedDll.get_Instance()
   at Sap.Data.Hana.HanaConnection..cctor()

Также попытался просто переместить dll в ту же папку, где установлено приложение, и получены те же результаты.

Согласно документации , dll находится вдолжна работать та же папка, что и приложение, или через путь к переменной среды HDBADONET (и она работала на нескольких других установках).Это часть общего рабочего процесса разработки и использования библиотеки ADO.NET для не родных приложений .NET , документированных здесь

Я пробовал это как пользователь "Администратор" иэто новая виртуальная машина, созданная (опробована как новая Windows10 x64 VM, так и новая Windows Server 2016 x64 VM).Также подтверждено, что был установлен .NET v4.5 +.

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

Любая подсказка, почему SAP HanaЗагрузка DLL соединения ADO.NET с БД не удастся, но не во всех случаях?

libadonetHDB.dll все еще пытается найти и загрузить libSQLDBCHDB.dll или другой dll на машине по какой-то причине?Насколько я понимаю, использование ADO.NET DLL позволило машине не требовать установки другого клиента и установки dll.

Какой именно module не может быть найден специально?Есть ли способ заставить загрузку DLL Hana Connection генерировать более подробный вывод при сбое?

Обновление

Чтобы подтвердить, что libadonetHDB.dll действительно найден с помощьюопределение переменной среды HDBADONET, я удалил файл и перепроверил, и я получил другое сообщение:

The type initializer for 'Sap.Data.Hana.HanaConnection' threw an exception.
System.IO.FileNotFoundException: Cannot find a matching libadonetHDB.dll 
with version 2.3.119 - check the location in the HDBADONET or PATH 
environment variables
   at Sap.Data.Hana.HanaUnmanagedDll.SearchNativeDlls()
   at Sap.Data.Hana.HanaUnmanagedDll..ctor()
   at Sap.Data.Hana.HanaUnmanagedDll.get_Instance()
   at Sap.Data.Hana.HanaConnection..cctor()

Итак, сообщение, опубликованное в оригинальном сообщении, приходит после того, как libadonetHDB.dll было успешно найдено.Таким образом, похоже, что жалоба в сообщении об исключении о невозможности найти или загрузить модуль ссылается на какой-либо другой ресурс или dll, которую он ищет, но сообщение недостаточно подробное, чтобы знать, что это такое.Есть идеи?

Обновление (решение)

Краткий ответ:

Проверка libadonetHDB.dll с Зависимости показывает, чтоmsvcr100.dll и msvcp100.dll оба отсутствовали на машине времени выполнения по какой-то причине.Добавление этих недостающих библиотек DLL в установочный пакет приложения решило проблему.

Более длинный ответ:

Спасибо donjuedo за предложение опросить библиотеку DLL, чтобы увидеть ее зависимости.Инструмент, который я использовал на компьютере, на котором произошел сбой, - Зависимости (для работы которого требуется установка распространяемого пакета x64 для vc ++, как указано в файле readme), обнаружил, что msvcr100.dll и msvcp100.dll оба отсутствовали какзависимости при проверке libadonetHDB.dll.Обратите внимание, что они были обнаружены только на этой конкретной машине, которая была только что созданной виртуальной машиной, поэтому на этой машине должен был проводиться тест и проверка.

Решением для включения отсутствующих библиотек DLL во время установки может быть добавление msvcr100.dll и msvcp100.dll в любое из следующих мест:

  • C:\Windows\System32 (вероятно, непредпочтительное решение, если вы хотите, чтобы ваше приложение не устанавливало вещи в основную системную папку)
  • папка, в которой также существует exe приложения
  • подпапка lib приложения, если вы добавляете путь к нейвложенная папка для определения переменной среды PATH (т. е. set PATH=%PATH%;fullpath\to\app\lib)

Эти две библиотеки уже были на нашей машине для разработки и, вероятно, уже являются частью многих машин времени выполнения / клиентов, которые уже давно работали и имели другое программное обеспечение, которое им требовалось.Если у вас их нет даже в разработке, загрузите их из официальных пакетов Microsoft, как указано здесь (избегайте получать их с сторонних веб-сайтов DLL, если хотите быть уверенными, что они не являются вредоносными программами, скрывающимися в DLL).).В идеале в документации по библиотеке SAP HanaDB ADO.NET должны быть указаны требования к машине времени выполнения или то, что разработчик .NET должен предоставить эти зависимые библиотеки DLL.

1 Ответ

1 голос
/ 02 июня 2019

Мое предложение состоит в том, чтобы использовать Dependency Walker (или другую аналогичную утилиту), чтобы определить, какую DLL ищет найденная DLL. Похоже, что одна найдена, но не все символьные зависимости были удовлетворены в этом случае.

Оптимизация имеет большое значение: замеченная ошибка была ошибкой во время выполнения, а не сборкой. Среды выполнения могут различаться, поэтому DLL, подобранная для соответствия требуемым символам, может отличаться. Устранение неисправностей должно быть выполнено в конкретной системе, в которой возникла исключительная ситуация.

...