Почему.NET не находит OpenSSL.NET DLL?
РЕДАКТИРОВАТЬ (весь вопрос, это было слишком непонятно)
Я хочу использовать OpenSSL.NET
Страница инструкций по установке OpenSSL.NET: УСТАНОВИТЬ
Убедитесь, что у вас есть libeay32.dll и ssleay32.dll в текущем рабочем каталоге вашего приложения или в вашем PATH. СДЕЛАННЫЙ
В своем проекте.NET добавьте ссылку на сборку ManagedOpenSsl.dll. СДЕЛАННЫЙ
я положил libeay32.dll
а также ssleay32.dll
в обоих моих bin/Debug
а также bin/Release
каталоги. Я также положил их в system32
,
Вот мой полный код:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
OpenSSL.Crypto.RSA rsa = new OpenSSL.Crypto.RSA();
}
catch (Exception e)
{
Console.WriteLine(e.InnerException.Message);
}
Console.Read();
}
}
}
Я получаю следующую ошибку: http://localhostr.com/files/a719c5/Error.gif (Невозможно загрузить DLL 'libeay32')
Вот журнал Process Monitor (по запросу): http://localhostr.com/files/726a46/ProcMon.gif
Что я делаю неправильно? Почему DLL не найдена?
12 ответов
Попробуйте последнюю версию OpenSSL.NET ( 0.4.1), которая теперь должна включать предварительно собранные двоичные файлы libeay32.dll и ssleay32.dll, которые статически связаны с ЭЛТ. Кроме того, вы можете собрать эти библиотеки самостоятельно или использовать "официальную" сборку с openssl.org.
Для всех, кто еще сталкивается с этой проблемой (и проверил, что необходимые условия существуют в их правильных местоположениях:
Ознакомьтесь с документацией по установке OpenSSL.NET и убедитесь, что установлены все необходимые компоненты. В моем случае пользователю не хватало зависимости распространяемого пакета Microsoft Visual C++ 2010 (x86), которая вызывается в документации OpenSSL.NET.
Не глядя на ваш код точно, я получаю эту ошибку, когда я:
- не указывайте dll в пути к исполняемому файлу (не там, где находится ваш sln, а в том месте, где создается.exe, обычно в bin/debug или bin/x86/debug или в любом другом).
- не имеют правильной сигнатуры вызывающей функции (то есть я пропустил целочисленный параметр, возвращаемые типы не совпадают и т. д.).
- неправильно маршаллизировать типы (т. е. BOOL маршалируется как bool, а bool маршализируется как целое число без байтов, однобайтовое и т. д.)- хотя последний из них не может вызывать исключение, он может вызывать явно странное поведение.
- Я на 64-битной платформе и вызываю 32-битную DLL. Размеры указателя будут разными, и DLL, вероятно, просто вылетит и вызовет это исключение.
РЕДАКТИРОВАТЬ: Когда все остальное терпит неудачу, попробуйте обходчик зависимостей, потому что кажется, что ваши библиотеки вызывают другие библиотеки, которые не находятся в вашем пути или в каталоге исполняемого файла.
Ваша проблема связана с этим вопросом:
DllNotFoundException, но DLL есть
Убедитесь, что все зависимости находятся в одной папке вашего приложения или зарегистрированы.
Попробуйте использовать зондирование. Вам необходимо создать файл конфигурации XML с именем полного исполняемого имени приложения (или с именем сборки, которая запрашивает вашу неуправляемую DLL) с расширением.config. Например, если ваши приложения имеют имя myapp.exe, файл конфигурации будет называться myapp.exe.config Файл конфигурации должен находиться в том же каталоге, что и исполняемый файл / сборка.
Файл конфигурации представляет собой простой XML-файл:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyuBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="PATH" />
</assemblyuBinding>
</runtime>
</configuration>
Теперь приложение будет искать в PATH при загрузке сборок. PATH относится к файлу конфигурации / сборки.
Не уверен, что это будет работать для неуправляемых dll, но стоит попробовать.
Создайте новую папку с именем x86 в пути к приложению, а затем поместите libeay32.dll,ssleay32.dll в папку x86.
Возможно, вам не хватает распространяемых VC++. Я предполагаю, что OpenSSL.NET - только x86, так что вы можете получить распространяемый x86 версии VS2008, если они выпускают сборки.
В противном случае, если они являются отладочными сборками (вы увидите Microsoft.VC90.DebugCRT в EventViewer или журналы sxstrace), вам потребуется:
- Перестрой их как релиз
- Установите или скопируйте распространяемые отладочные файлы с другого компьютера
- Установите Visual C++ в Visual Studio (или, возможно, Visual C++ Express)
В крайнем случае, если ничего не работает
Может быть полезно знать, где приложение (.net или нет) ищет библиотеки DLL. Просто используйте Process Monitor и фильтр для имени файла DLL. Затем скопируйте его в место, где его ищет приложение.
Попробуйте изменить целевую платформу для вашего проекта на x86 вместо "любой процессор".
.NET способ сделать это, чтобы установить вашу сборку в глобальном кэше сборок.
Каждый компьютер, на котором установлена среда выполнения с общим языком, имеет машинный кэш кода, называемый глобальным кэшем сборок. В глобальном кэше сборок хранятся сборки, специально предназначенные для совместного использования несколькими приложениями на компьютере.
В моем случае, когда мы разрабатываем веб-сайт с открытым ssl на платформах x64 win 2008, мы должны проверить с помощью пула приложений: разрешить 32 приложения: верно
Я нашел решение.
К сожалению, распространяемый пакет VS2008 C++ не работал - мне пришлось установить версию SP1 И VC++2008. Автор сказал в комментарии на своем сайте, что это была ошибка на его стороне, а не моя. В настоящее время он перекомпилирует библиотеки DLL, чтобы они были статически связаны. Спасибо всем, кто помог мне:)