为什么不.NET找到OpenSSL.NET的dll?(Why doesn't .NET fi

2019-07-17 10:58发布

编辑 (整个的问题,它是太清楚)

我想用OpenSSL.NET

该OpenSSL.NET安装说明页: INSTALL

请确保您有和的libeay32.dll ssleay32.dll在应用程序的当前工作目录或者在路径中。 DONE
在你的.NET项目,添加到ManagedOpenSsl.dll集的引用。 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();
        }
    }
}

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

下面是过程监控日志(根据要求): 替代文字http://localhostr.com/files/726a46/ProcMon.gif

我究竟做错了什么? 为什么不是DLL发现了什么?

Answer 1:

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



Answer 2:

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

  • 没有这些DLL的可执行文件的路径(不是您的SLN所在,但其中的.exe制成,通常在斌/调试或斌/ 86 /调试或其他)。
  • 没有调用函数的正确的签名(即我留下了一个整型参数,返回类型不匹配,等等)。
  • 我不是编组类型正确(即BOOL被编组为一个布尔值,而布尔被编组为一个无符号的单字节整数,等) - 而这最后一个可能不会引起异常,它可能会导致断然时髦行为。
  • 是一个64位平台上和我打电话一个32位的DLL。 指针的大小会各不相同,DLL将可能只是崩溃,并造成异常。

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



Answer 3:

对于任何人那里仍然遇到这个问题(并且已经证实,在正确的位置存在的必要先决条件:

检查OpenSSL.NET安装文件 ,并确保其先决条件安装。 在我的情况下,用户是缺少微软的Visual C ++ 2010可再发行组件包(x86),这是该OpenSSL.NET文档中叫出来的依赖。



Answer 4:

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

DllNotFoundException,但DLL有

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



Answer 5:

尝试使用探测。 你需要创建一个名为作为应用程序的可执行文件的完整名称(或命名为requieres您的非托管的DLL程序集)用的.config扩展名的XML配置文件。 例如,如果您的应用程序是名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工作,但值得尝试。



Answer 6:

这样做的.NET的办法是安装程序集在全局程序集缓存 。

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



Answer 7:

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

这可能是有用的知道那里的应用程序(.NET或不)正在寻找的DLL。 只需使用过程监控和过滤器的DLL的文件名。 然后将它复制到应用程序寻找它的位置。



Answer 8:

你可能缺少VC ++重新发布。 我假设OpenSSL.NET是仅适用于x86,这样你就可以抓住VS2008版本的x86可再发行如果他们发布版本。

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

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


Answer 9:

我找到了解决办法。

不幸的是,VS2008 C ++可再发行组件没有工作 - 我必须安装SP1版本和VC ++ 2008。 笔者在其网站上评论说,这是在其一侧一个错误,而不是我的。 目前,他正在重新编译的DLL静态链接。 感谢所有那些谁帮我的:)



Answer 10:

试着改变目标平台为你的项目给86,而不是“任何CPU”。



Answer 11:

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



Answer 12:

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



文章来源: Why doesn't .NET find the OpenSSL.NET dll?