2009-09-08 67 views
9

编辑(整个问题,它太不清楚)为什么.NET不能找到OpenSSL.NET DLL?

我想用OpenSSL.NET

的OpenSSL.NET安装说明页:INSTALL

Make sure you have libeay32.dll and ssleay32.dll in the current working directory of your application or in your PATH. DONE
In your .NET project, add a reference to the ManagedOpenSsl.dll assembly. DONE

我已经把libeay32.dllssleay32.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(); 
     } 
    } 
} 

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

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

我在做什么错?为什么没有找到该DLL?

+2

BTW,C#不搜索对于DLL - .NET的确如此。 – 2009-09-08 20:33:18

+2

你的系统是64位的吗?更重要的是,你的.NET应用AnyCPU或x86? – ConsultUtah 2009-09-08 20:55:04

+0

我的系统是32位的,我不知道如何检查其他设置。 – Lazlo 2009-09-08 21:14:19

回答

5

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

0

这样做的.NET的办法是安装你的组件在global assembly cache

Each computer where the common language runtime is installed has a machine-wide code cache called the global assembly cache. The global assembly cache stores assemblies specifically designated to be shared by several applications on the computer.

+0

没有更简单的方法吗?考虑到我会分享我的二进制文件,这不是很有用。 – Lazlo 2009-09-08 20:33:37

+0

考虑到你对.NET不熟悉,我建议“在罗马时,像罗马人那样做”。 – 2009-09-08 20:40:53

2

没有在你的代码完全看,我得到这个错误,当我:

  • 没有在可执行文件的路径的dll文件(不是您的SLN所在,但其中的.exe通常在bin/debug或bin/x86/debug或其他)。
  • 没有调用函数的正确签名(即,我省略了整数参数,返回类型不匹配等)。
  • 上午无法正常编组类型(例如,BOOL被编组为一个布尔值,而布尔被编组为一个无符号的单字节整数,等) - 而这最后一个可能不会引起异常,它可能会导致断然时髦行为。
  • 在64位平台上,我正在调用一个32位的DLL。指针大小将全部不同,并且dll可能只会崩溃并导致该异常。

编辑:当一切都失败了,尝试dependency walker,因为它听起来像你的DLL呼吁不在您的路径或可执行文件的目录中其他DLL。

+0

我有.exe路径中的Dll,并且该函数是正确的。 – Lazlo 2009-09-08 20:32:17

+0

到你的编辑:我相信这些类型正确使用。我只使用默认代码初始化API。 而且我正在运行一个32位dll的32位机器。 – Lazlo 2009-09-08 20:34:39

+0

依赖沃克,然后,如我加入。它可能会告诉你,你失去了一些东西。 – mmr 2009-09-08 20:40:08

1

您的问题是与这个问题有关:

DllNotFoundException, but DLL is there

验证是否所有depencencies在你的应用程序的同一个文件夹或者是registred。

+0

我做到了。仍然不起作用。如果没有,请重新阅读编辑。 – Lazlo 2009-09-08 21:20:17

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相对于config/assembly文件。

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

0

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

这可能是有用的知道那里的应用程序(.NET或不)正在寻找的DLL。只需使用Process Monitor并筛选该DLL的文件名。然后将其复制到应用程序正在查找的位置。

+0

这是procmon日志: http://localhostr.com/files/726a46/ProcMon.gif – Lazlo 2009-09-08 21:23:47

0

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

否则,如果他们是调试版本(你会看到Microsoft.VC90.DebugCRT在事件查看器或sxstrace日志),那么你就需要:

  • 重建他们作为释放
  • 安装或从另一台机器
  • 复制调试再分发安装Visual C++到Visual Studio(或者,可能时,Visual C++快递)
0

我找到了解决方案。

不幸的是,VS2008 C++可再发行组件包不起作用 - 我不得不安装SP1版本和VC++ 2008。作者在其网站上发表评论说,这是一个错误,而不是我的。他目前正在重新编译DLL以静态链接。感谢所有帮助我的人:)

0

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

0

在我的情况下,当我们开发一个网站打开SSL在x64赢得2008平台,我们必须与应用程序池检查:允许32个应用程序:真正的

enter image description here