为什么.NET没有找到OpenSSL.NET DLL?

时间:2009-09-08 20:26:12

标签: c# .net dll dllimport dllnotfoundexception

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

我想使用OpenSSL.NET

OpenSSL.NET安装说明页面:INSTALL

  

确保当前有效的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();
        }
    }
}

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

这是Process Monitor日志(根据要求): alt text http://localhostr.com/files/726a46/ProcMon.gif

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

12 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

如果没有准确查看您的代码,我会在以下时收到该错误:

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

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

答案 2 :(得分:2)

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

检查OpenSSL.NET installation documentation并确保已安装其先决条件。在我的情况下,用户错过了在OpenSSL.NET文档中调用的Microsoft Visual C++ 2010 Redistributable Package (x86)依赖项。

答案 3 :(得分:1)

您的问题与此问题有关:

DllNotFoundException, but DLL is there

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

答案 4 :(得分: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是相对于配置/程序集文件。

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

答案 5 :(得分:0)

.NET的方法是在global assembly cache

中安装程序集
  

每台电脑常见的地方   语言运行库安装有一个   机器范围的代码缓存称为   全局程序集缓存。全球   程序集缓存存储程序集   专门指定分享   通过几个应用程序   计算机。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

我找到了解决方案。

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

enter image description here

答案 11 :(得分:0)

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