Почему на некоторых машинах происходит сбой LoadLibrary при вызове dll с использованием P / Invoke? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть приложение .NET, которое вызывает API C ++ с использованием P / Invoke. DLL C ++ зависит от сторонних библиотек DLL. Эта dll третьей стороны вызывает LoadLibrary для динамической загрузки libeay32.dll, зависимости OpenSSL.

После нескольких тестов я обнаружил, что приложение .NET правильно работает в Windows 10, но не работает в некоторых развертываниях с использованием Windows 7. Причина сбоя заключается в том, что процесс .NET не загружает libeay32.dll. Я попытался поместить libeay32.dll в тот же каталог, что и процесс, и в системную папку (имея в виду порядок поиска с динамической загрузкой), но ошибка сохранилась только в 32-разрядной версии Windows 7. Кроме того, если бы я вызывал dll API из консольного приложения C ++, это работало без проблем на всех платформах. Чтобы решить эту проблему, я вызвал LoadLibrary в приложении .NET, прежде чем вызывать P / Invoke для API C ++, и он работал на всех целевых платформах (Windows 10/7 32 и 64 бит).

Почему бы LoadLibrary не удалось загрузить libeay32.dll в Windows 7, но не в Windows 10, если она вызывается из зависимости Cll DLL API, вызываемой с помощью P / Invoke?

Редактировать Некоторые заметки из комментариев:

  1. Все скомпилированные сборки предназначены для архитектуры x86.
  2. Перед публикацией вопроса я проверил, что нет файлов зависимостей где отсутствует, с помощью обходчика зависимостей.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

.Net-приложения могут быть созданы с AnyCPU в качестве цели и работать в 64- и 32-битном режимах, но если вы выберете AnyCPU для своей цели, операционная система выберет одно на основе своих предпочтений. Если у вас есть собственные зависимости, это может означать, что библиотека, от которой вы зависите, не может быть загружена, потому что вы работаете с неправильной разрядностью. Если вы можете ограничить приложение ожидаемой битностью, оно может работать лучше.

0 голосов
/ 02 ноября 2018

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

...