Pergunta

EDITAR (toda a questão, não estava muito claro)

Eu quero usar OpenSSL.net

A página OpenSSL.net Instruções de instalação: INSTALAR

Certifique -se de ter libeay32.dll e ssleay32.dll no diretório de trabalho atual do seu aplicativo ou no seu caminho. FEITO
No seu projeto .NET, adicione uma referência ao Assembly ManagenDoSSL.dll. FEITO

Eu coloquei libeay32.dll e ssleay32.dll em ambos bin/Debug e bin/Release diretórios. Eu também os coloquei em system32.

Aqui está o meu código completo:

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();
        }
    }
}

Estou tendo o erro a seguir:Não é possível carregar dll 'libeay32' http://localhostr.com/files/a719c5/error.gif(Incapaz de carregar DLL 'libeay32')

Aqui está o Log do Monitor do Process (mediante solicitação):TEXTO DE ALT HTTP://localhostr.com/files/726a46/procmon.gif

O que estou fazendo errado? Por que a DLL não foi encontrada?

Foi útil?

Solução

Experimente a versão mais recente do OpenSSL.net (0.4.1) que agora devem incluir binários pré -construídos libeay32.dll e ssleay32.dll que vinculam ao CRT estaticamente. Como alternativa, você pode construir essas bibliotecas ou usar uma construção 'oficial' no OpenSSL.org.

Outras dicas

Sem olhar exatamente para o seu código, recebo esse erro quando:

  • Não tenha as DLLs no caminho do executável (não onde reside o seu SLN, mas onde o .exe é feito, normalmente em bin/depuração ou bin/x86/depuração ou qualquer outra coisa).
  • Não tenha a assinatura adequada da função de chamada (ou seja, deixei de fora um parâmetro inteiro, os tipos de retorno não correspondem, etc.).
  • Não estou organizando os tipos corretamente (ou seja, o bool é organizado como um bool, enquanto Bool é marcado como um número inteiro de byte único não assinado, etc.)- enquanto este último pode não causar a exceção, pode causar um comportamento decididamente descolado.
  • Estou em uma plataforma de 64 bits e estou chamando uma DLL de 32 bits. Os tamanhos do ponteiro serão todos diferentes, e a DLL provavelmente travará e causará essa exceção.

Editar: quando tudo mais falhar, tente Walker dependência, porque parece que suas DLLs estão chamando outras DLLs que não estão no seu caminho ou no diretório do executável.

Para qualquer outra pessoa, ainda está enfrentando esse problema (e verificou que os pré -requisitos necessários existem em seus locais corretos:

Verifica a Documentação de instalação do OpenSSL.NET e verifique se seus pré -requisitos estão instalados. No meu caso, um usuário estava faltando o Microsoft Visual C ++ 2010 Pacote redistribuível (x86) Dependência que é chamada na documentação do OpenSSL.NET.

Seu problema está relacionado a esta pergunta:

DllnotfoundException, mas a dll está lá

Verifique se todas as dependências estão na mesma pasta do seu aplicativo ou são registradas.

Tente usar sondagem. Você precisa criar um arquivo de configuração XML nomeado como o nome completo executável do aplicativo (ou nomeado como a Assembléia que requer sua DLL não gerenciada) com uma extensão .config. Por exemplo, se seus aplicativos forem nome myapp.exe, o arquivo de configuração será nomeado myapp.exe.config O arquivo de configuração deve estar localizado no mesmo diretório que o executável / montagem.

O arquivo de configuração é um arquivo XML simples:

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

Agora, o aplicativo pesquisará no caminho ao carregar os conjuntos. O caminho é relativo ao arquivo de configuração /montagem.

Não tenho certeza se funcionará para DLLs não gerenciados, mas vale a pena tentar.

A maneira .NET de fazer isso é instalar sua montagem no cache global de montagem.

Cada computador em que o tempo de execução do idioma comum é instalado possui um cache de código em toda a máquina chamado cache global de montagem. Os conjuntos de armazenamentos de cache de cache de montagem global especificamente designados para serem compartilhados por vários aplicativos no computador.

Como último recurso, se nada mais funcionar:

Pode ser útil saber onde o aplicativo (.NET ou não) está procurando as DLLs. Apenas use Monitor do processo e filtre para o nome do arquivo da DLL. Em seguida, copie -o para um local em que o aplicativo esteja procurando.

Você provavelmente está perdendo os redistribu das redistribu das vc ++. Estou assumindo que OpenSSL.net é apenas x86, então você pode Pegue a versão VS2008 X86 Redistribuível Se eles estão lançando construções.

Caso contrário, se eles estão debruir (você verá Microsoft.vc90.debugcrt no EventViewer ou nos logs do SXSTRACE), você precisará:

  • Reconstruí -los como liberação
  • Instale ou copie os redistribuíveis de depuração de outra máquina
  • Instale o Visual C ++ no Visual Studio (ou provavelmente, Visual C ++ Express)

Eu encontrei uma solução.

Infelizmente, o pacote redistribuível do VS2008 C ++ não funcionou - eu tive que instalar a versão SP1 e o VC ++ 2008. O autor disse em um comentário em seu site que foi um erro do seu lado, e não o meu. Atualmente, ele está recompilando as DLLs para estar estaticamente vinculado. Obrigado a todos aqueles que me ajudaram :)

Tente alterar o destino da plataforma para o seu projeto para x86 em vez de "qualquer CPU".

No meu caso, quando desenvolvemos um site com o SSL Open no X64 Win 2008 Platforms, devemos verificar com o pool de aplicativos: Permitir 32 aplicativos: true

enter image description here

Crie uma nova pasta chamada x86 no caminho do seu aplicativo e, em seguida, coloque libeay32.dll, ssleay32.dll na pasta x86.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top