为什么.NET没有找到OpenSSL.NET DLL?
编辑 (整个问题,它太不清楚了)
我想使用OpenSSL.NET
OpenSSL.NET安装说明页面: INSTALL
确保在应用程序的当前工作目录或PATH中有libeay32.dll和ssleay32.dll。 DONE
在.NET项目中,添加对ManagedOpenSsl.dll程序集的引用。 DONE
我已将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(); } } }
我收到以下错误: 无法加载DLL’libeay32’http://sofzh.miximages.com/c%23/Error.gif (无法加载DLL’libeay32’)
这是Process Monitor日志(根据要求): alt text http://sofzh.miximages.com/c%23/ProcMon.gif
我究竟做错了什么? 为什么找不到DLL?
尝试使用最新版本的OpenSSL.NET( 0.4.1 ),它现在应该包含预构建的libeay32.dll和静态链接到CRT的ssleay32.dll二进制文件。 或者,您可以自己构建这些库,也可以使用openssl.org中的“官方”构建。
在没有准确查看代码的情况下,当我:
- 没有dll在可执行文件的路径中(不是你的sln所在的地方,而是.exe所在的地方,通常在bin / debug或bin / x86 / debug或其他)。
- 没有调用函数的正确签名(即,我省略了一个整数参数,返回类型不匹配等)。
- 我没有正确地编组类型(即BOOL被编组为bool,而bool被编组为无符号单字节整数等) – 虽然最后一个可能不会导致exception,但它可能会导致明显的时髦行为。
- 我在64位平台上,并调用32位dll。 指针大小将全部不同,dll可能只会崩溃并导致该exception。
编辑:当所有其他失败时,尝试依赖walker ,因为它听起来像你的dll正在调用不在你的路径或可执行文件目录中的其他dll。
对于其他任何人仍然遇到此问题(并已validation必要的先决条件存在于其正确的位置:
检查OpenSSL.NET安装文档并确保已安装其先决条件。 在我的例子中,用户错过了Microsoft Visual C ++ 2010 Redistributable Package(x86)依赖项,该依赖项在OpenSSL.NET文档中被调用。
您的问题与此问题有关:
DllNotFoundException,但DLL就在那里
validation所有依赖项是否都在您的应用程序的同一文件夹中或注册。
尝试使用探测。 您需要创建一个XML配置文件,该文件名为应用程序的可执行完整名称(或命名为需要非托管dll的程序集),扩展名为.config。 例如,如果您的应用程序是名称myapp.exe,则配置文件将命名为myapp.exe.config配置文件必须与可执行文件/程序集位于同一目录中。
配置文件是一个简单的xml文件:
现在,应用程序将在加载程序集时在PATH中搜索。 PATH是相对于config / assembly文件的。
不确定它是否适用于非托管dll,但值得尝试。
.NET的方法是在全局程序集缓存中安装程序集 。
安装公共语言运行库的每台计算机都有一个称为全局程序集缓存的机器级代码缓存。 全局程序集缓存存储专门指定由计算机上的多个应用程序共享的程序集。
作为最后的手段,如果没有其他工作:
知道应用程序(.net与否)正在寻找DLL的位置可能很有用。 只需使用Process Monitor并过滤DLL的文件名即可。 然后将其复制到应用程序正在查找的位置。
您可能错过了VC ++可再发行组件。 我假设OpenSSL.NET只是x86,所以如果它们是发布版本,你可以获取VS2008版本x86可再发行版。
否则,如果它们是调试版本(您将在EventViewer或sxstrace日志中看到Microsoft.VC90.DebugCRT),那么您将需要:
- 将它们重建为发布版
- 从另一台计算机安装或复制调试可再发行组件
- 将Visual C ++安装到Visual Studio中(或者,可能是Visual C ++ Express)
我找到了解决方案。
不幸的是,VS2008 C ++ Redistributable包无效 – 我必须安装SP1版本和VC ++ 2008。 作者在其网站上发表评论说,这是一个错误,而不是我的错误。 他目前正在重新编译要静态链接的DLL。 谢谢所有帮助过我的人:)
尝试将项目的平台目标更改为x86而不是“任何cpu”。
在我的例子中,当我们在x64 win 2008平台上开发一个开放ssl的网站时,我们必须检查应用程序池:允许32个应用程序:true