Почему.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, чтобы они были статически связаны. Спасибо всем, кто помог мне:)

Другие вопросы по тегам