Почему? t.NET найти OpenSSL.NET dll?

редактировать (весь вопрос, он был слишком неясен)

Я хочу использовать OpenSSL.NET

OpenSSL.NET страница инструкции по установке:установить

убедитесь, что у вас libeay32.dll и ssleay32.dll в текущей работе каталог вашего приложения или в вашем пути. сделал
В проекте .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();
        }
    }
}

Я получаю следующую ошибку: не удалось загрузить DLL 'libeay32' http://localhostr.com/files/a719c5/Error.gif (Не удалось загрузить DLL 'libeay32')

вот процесс Журнал монитора (по запросу): alt текст http://localhostr.com/files/726a46/ProcMon.gif

что я делаю не так? Почему не в DLL нашел?

11 ответов


попробуйте последнюю версию OpenSSL.NET (0.4.1), который теперь должен включать prebuilt libeay32.dll и ssleay32.двоичные файлы dll, которые ссылаются на CRT статически. Кроме того, вы можете создать эти библиотеки самостоятельно или использовать "официальную" сборку из openssl.org.


не глядя на ваш код, я получаю эту ошибку, когда я:

  • не имеют DLL в пути исполняемого файла (не там, где находится ваш sln, но где .exe выполняется, как правило, в bin / debug или bin / x86 / debug или что-то еще).
  • не имеют правильной подписи вызывающей функции (т. е. я оставил целочисленный параметр, возвращаемые типы не совпадают и т. д.).
  • Я не сортирую типы должным образом (т. е. BOOL сортируется как bool, хотя bool маршалируется как однобайтовое целое число без знака и т. д.) - Хотя это последнее не может вызвать исключение, оно может вызвать определенно фанк-поведение.
  • am на 64-битной платформе и вызываю 32-битную dll. Размеры указателя будут разными, и dll, вероятно, просто произойдет сбой и вызовет это исключение.

EDIT: когда все остальное не удается, попробуйте зависимость walker, потому что похоже, что ваши библиотеки DLL вызывают другие библиотеки, которые не находятся в ваш путь или в каталоге исполняемого файла.


для кого-либо еще там все еще испытывают эту проблему (и проверили, что необходимые предварительные условия существуют в их правильных местах:

Проверьте OpenSSL.NET документация по установке и убедитесь,что установлены необходимые компоненты. в моем случае пользователю не хватало распространяемый пакет Microsoft Visual C++ 2010 (x86) зависимость, которая вызывается в OpenSSL.NET документация.


ваша проблема связана с этим вопрос:

DllNotFoundException, но DLL есть

убедитесь, что все depencencies находятся в одной папке вашего приложения или зарегистрированы.


попробуйте с помощью прощупывания. Необходимо создать XML-файл конфигурации с полным именем исполняемого файла приложения (или с именем сборки, требующей неуправляемой библиотеки dll) с помощью a .расширением config. Е. Г. если приложения это приложение myapp имя.exe, файл конфигурации будет называться myapp.исполняемый.конфиг Файл конфигурации должен находиться в том же каталоге, что и исполняемый файл / сборка .

файл конфигурации представляет собой простой xml-файл:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyuBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="PATH" />
    </assemblyuBinding>
  </runtime>
</configuration>

теперь приложение будет искать в пути при загрузке сборок. Путь относится к файлу config / assembly.

Не уверен, что он будет работать для неуправляемых библиотек DLL, но стоит попробовать.


.NET способ сделать это-установить сборку в глобальный кэш сборок.

каждый компьютер, где общие установлено среды CLR имеет кэш кода называется глобальный кэш сборок. Мировой кэш сборок хранит сборки специально предназначенные для совместного несколькими приложениями на компьютер.


в крайнем случае, если ничего не работает:

может быть полезно знать, где приложение (.net или нет) ищет библиотеки DLL. Просто используйте Контролировать Процесс и фильтр для имени файла библиотеки DLL. Затем скопируйте его в место, где приложение ищет его.


вероятно, вам не хватает распространяемых файлов VC++. Я предполагаю, что OpenSSL.NET это только для x86, так что вы можете захватите распространяемую версию VS2008 x86 если они выпускают сборки.

в противном случае, если они отладочные сборки (вы увидите Microsoft.VC90.DebugCRT в EventViewer или журналах sxstrace), то вам нужно будет либо:

  • перестроить их как release
  • установите или скопируйте распространяемые отладочные файлы из другого машина!--8-->
  • установите Visual C++ в Visual Studio (или, возможно, Visual C++ Express)

Я нашел решение.

к сожалению, распространяемый пакет VS2008 C++ не работал - мне пришлось установить версию SP1 и VC++2008. Автор сказал в комментарии на своем веб-сайте, что это была ошибка с его стороны, а не моя. В настоящее время он перекомпилирует DLL для статической связи. Спасибо всем, кто помог мне:)


попробуйте изменить целевую платформу для вашего проекта на x86 вместо "любой ЦП".


в моем случае, когда мы разрабатываем веб-сайт с открытым ssl на платформах x64 win 2008, мы должны проверить с пулом приложений: разрешить 32 приложения: true

enter image description here