【问题标题】:Why doesn't .NET find the OpenSSL.NET dll?为什么 .NET 找不到 OpenSSL.NET dll?
【发布时间】:2010-11-26 15:20:44
【问题描述】:

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

我想用OpenSSL.NET

OpenSSL.NET 安装说明页面:INSTALL

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

我在我的 bin/Debugbin/Release 中都输入了 libeay32.dllssleay32.dll > 目录。我也把它们放在 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();
        }
    }
}

我收到以下错误: Unable to load DLL 'libeay32' http://localhostr.com/files/a719c5/Error.gif (无法加载 DLL 'libeay32')

这是进程监视器日志(根据要求): alt text http://localhostr.com/files/726a46/ProcMon.gif

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

【问题讨论】:

  • 顺便说一句,C# 不会搜索 DLL - .NET 会。
  • 您的系统是 64 位的吗?更重要的是,您的 .NET 应用程序是 AnyCPU 还是 x86?
  • 我的系统是32位的,不知道如何查看其他设置。
  • 您是否尝试按照错误消息中的建议运行 sxstrace.exe 工具?

标签: c# .net dll dllimport dllnotfoundexception


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    没有仔细查看您的代码,当我:

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

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

    【讨论】:

    • 我在.exe的路径中有dll,功能是对的。
    • 致您的编辑:我确信这些类型使用得当。我只使用默认代码初始化 API。我正在运行一个带有 32 位 dll 的 32 位机器。
    • 依赖漫游器,然后,正如我添加的那样。它可能会告诉你你错过了什么。
    • 不,我缺少的 dll 是 libeay32.dll,我拥有并且在 system32 和 exe 文件夹中。
    • 对,但是当 libeay32.dll 调用其他一些 dll 时,您可以得到那个 dllnotfound 异常。 Dependency walker 将向您展示缺少的内容(如果有的话)。
    【解决方案3】:

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

    检查 OpenSSL.NET installation documentation 并确保已安装其先决条件。在我的例子中,用户缺少在 OpenSSL.NET 文档中提到的 Microsoft Visual C++ 2010 Redistributable Package (x86) 依赖项。

    【讨论】:

      【解决方案4】:

      你的问题与这个问题有关:

      DllNotFoundException, but DLL is there

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

      【讨论】:

      • 我做到了。还是不行。如果还没有,请重新阅读编辑。
      【解决方案5】:

      尝试使用探测。您需要创建一个 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,但值得一试。

      【讨论】:

        【解决方案6】:

        .NET 的做法是将程序集安装在 global assembly cache 中。

        每台计算机都有共同点 安装语言运行时有一个 机器范围的代码缓存称为 全局程序集缓存。全球 程序集缓存存储程序集 特别指定为共享 通过几个应用程序 电脑。

        【讨论】:

        • 没有更简单的方法吗?考虑到我将分享我的二进制文件,这不是很有用。
        • 考虑到你对 .NET 不熟悉,我建议“在罗马,像罗马人那样做”。
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

          • 将它们重建为发布版
          • 从另一台机器安装或复制调试可再发行组件
          • 将 Visual C++ 安装到 Visual Studio(或者可能是 Visual C++ Express)中

          【讨论】:

            【解决方案9】:

            我找到了解决办法。

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-10-07
                    • 2011-06-24
                    • 2014-05-08
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多