9

编辑(整个问题,太不清楚了)

我想使用OpenSSL.NET

OpenSSL.NET 安装说明页面:安装

确保在应用程序的当前工作目录或 PATH 中有 libeay32.dll 和 ssleay32.dll。完成
在您的 .NET 项目中,添加对 ManagedOpenSsl.dll 程序集的引用。完毕

我已经把libeay32.dllandssleay32.dll放在了我的bin/Debugbin/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 text http://localhostr.com/files/726a46/ProcMon.gif

我究竟做错了什么?为什么找不到DLL?

4

12 回答 12

4

尝试最新版本的 OpenSSL.NET ( 0.4.1 ),它现在应该包括静态链接到 CRT 的预构建 libeay32.dll 和 ssleay32.dll 二进制文件。或者,您可以自己构建这些库或使用来自 openssl.org 的“官方”构建。

于 2009-09-09T07:49:26.437 回答
2

如果不仔细查看您的代码,当我执行以下操作时会出现该错误:

  • 在可执行文件的路径中没有 dll(不是您的 sln 所在的位置,而是 .exe 的制作位置,通常在 bin/debug 或 bin/x86/debug 或其他位置)。
  • 没有调用函数的正确签名(即,我遗漏了一个整数参数,返回类型不匹配等)。
  • 我没有正确编组类型(即,BOOL 被编组为 bool,而 bool 被编组为无符号单字节整数等)——虽然最后一个可能不会导致异常,但它可能会导致明显的时髦行为。
  • 我在 64 位平台上,正在调用 32 位 dll。指针大小将完全不同,并且 dll 可能会崩溃并导致该异常。

编辑:当所有其他方法都失败时,请尝试dependency walker,因为听起来您的 dll 正在调用不在您的路径或可执行文件目录中的其他 dll。

于 2009-09-08T20:29:40.263 回答
2

对于仍然遇到此问题的其他任何人(并已验证其正确位置存在必要的先决条件:

检查OpenSSL.NET 安装文档并确保已安装其先决条件。就我而言,用户缺少Microsoft Visual C++ 2010 Redistributable Package (x86)依赖项,该依赖项在 OpenSSL.NET 文档中被提及。

于 2013-03-06T21:04:33.093 回答
1

您的问题与此问题有关:

DllNotFoundException,但 DLL 存在

验证所有依赖项是否在您的应用程序的同一文件夹中或已注册。

于 2009-09-08T20:40:00.133 回答
1

尝试使用探测。您需要创建一个 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 相对于 config /assembly 文件。

不确定它是否适用于非托管 dll,但值得一试。

于 2009-09-08T20:52:23.950 回答
0

我找到了解决方案。

不幸的是,VS2008 C++ Redistributable 包不起作用——我必须安装 SP1 版本和 VC++2008。作者在其网站上的评论中说,这是自己的错误,而不是我的错误。他目前正在重新编译要静态链接的 DLL。感谢所有帮助过我的人:)

于 2009-09-09T23:07:00.733 回答
0

执行此操作的 .NET 方法是将程序集安装在全局程序集缓存中。

安装了公共语言运行时的每台计算机都有一个机器范围的代码缓存,称为全局程序集缓存。全局程序集缓存存储专门指定为由计算机上的多个应用程序共享的程序集。

于 2009-09-08T20:28:19.967 回答
0

您可能缺少 VC++ 可再发行组件。我假设 OpenSSL.NET 只有 x86,所以如果它们是发布版本,您可以获取 VS2008 版本 x86 可再发行版本。

否则,如果它们是调试版本(您将在 EventViewer 或 sxstrace 日志中看到 Microsoft.VC90.DebugCRT),那么您需要:

  • 将它们重建为发布
  • 从另一台机器安装或复制调试可再发行组件
  • 将 Visual C++ 安装到 Visual Studio(或者,可能是 Visual C++ Express)
于 2009-09-09T00:14:39.583 回答
0

作为最后的手段,如果没有其他办法:

了解应用程序(.net 与否)在哪里寻找 DLL 可能很有用。只需使用进程监视器并过滤 DLL 的文件名。然后将其复制到应用程序正在查找它的位置。

于 2009-09-08T21:01:44.047 回答
0

尝试将项目的平台目标更改为 x86 而不是“任何 cpu”。

于 2010-05-11T11:59:12.827 回答
0

在我的例子中,当我们在 x64 win 2008 平台上开发一个开放 ssl 的网站时,我们必须检查应用程序池:允许 32 个应用程序:true

在此处输入图像描述

于 2013-03-07T09:41:49.103 回答
0

在您的应用程序路径中创建名为 x86 的新文件夹,然后将 libeay32.dll、ssleay32.dll 放入 x86 文件夹中。

于 2019-01-04T12:57:00.220 回答