• OpenSSL.Net 在生产环境中无法正常加载的原因分析与解决 z


    http://blog.csdn.net/wangjia184/article/details/6990098

    http://www.openssl.org/

    在本地测试好好的代码部署到生产环境后,遇到OpenSSL.Net不能加载的错误。

    Could not load file or assembly 'ManagedOpenSsl' or one of its dependencies. An attempt was made to load a program with an incorrect format.

    ManagedOpenSsl.dll 是一个对 unmanaged的libeay32.dllssleay32.dll 进行包装的Assembly.

    它通过P/Invoke调用openssl的dll导出函数,并提供对.Net友好的对象封装方式

    而这个错误一般由以下两点原因造成的:

    1.  libeay32.dll 和 ssleay32.dll 这两个动态库使用动态链接VC Runtime的方式编译的,因为服务器上没有安装VC++ Runtime而导致加载失败。

    2. 服务器操作系统是x64,而这些动态库却是x86的,导致加载失败。

    对于这两个原因,下面逐步说明解决方式。

    1. VC 运行时(Runtime)依赖性的问题


    如果使用Depends.exe查看 从http://openssl-net.sourceforge.net/ 上下载的两个非托管DLL文件,会发现它们都引用了MSVER100.dll, 而此DLL却不是系统自带的。

    要解决这个问题,可以使用静态链接VC Runtime的方式编译自己需要的openssl dll.

    1. 首先安装 ActivePerl http://www.activestate.com/activeperl/downloads
    2. http://www.openssl.org/下载最新的openssl源代码包
    3. 在开始菜单中找到 Visual Studio 的命令提示符(Visual Studio Command Prompt),也就是vcvarsall.bat设置好x86编译需要环境变量
    4. 在命令提示符窗口中 切换到下载的openssl源代码包的位置
    5. 执行  perl configure VC-WIN32
    6. 执行 msdo_ms
    7. 用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
    8. 回到命令提示符下,继续执行 nmake -f ms tdll.mak 编译
    9. 编译成功后,就可以在out32dll目录下找到这2个DLL了, 替换掉原有的即可。

    2. x64操作系统的问题


    如果服务器是x64操作系统,如Windows 2008 R2, 那么由于这些dll都是x86环境下的,也会导致加载失败。

    对于这类问题最简单的解决办法是,修改IIS应用程序池的设置,允许32bit代码的执行。这种方式并不好,实际上进程被限制在WOW64上运行,对性能会有影响。

    最好还是编译一套x64版本的dll,这样无需修改任何IIS设置也可保证运行。

      1. 在开始菜单中找到 Visual Studio 的x64环境命令提示符(Visual Studio x64 Cross Tools Command Prompt ),也就是vcvarsall.bat设置好x64编译需要环境变量
      2. 在命令提示符窗口中 切换到下载的openssl源代码包的位置
      3. 执行  perl configure VC-WIN64A
      4. 执行 msdo_win64a
      5. 用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
      6. 继续修改ntdll.mak
        # The output directory for everything intersting
        OUT_D=out64dll
        # The output directory for all the temporary muck
        TMP_D=tmp64dll
        # The output directory for the header files
        INC_D=inc64
        INCO_D=inc64openssl
      7. 回到命令提示符下,继续执行 nmake -f ms tdll.mak 编译
      8. openssl编译成功后,就可以在out64dll目录下找到这2个DLL了。
      9. 使用GIT客户端下载最新的 OpenSSL.Net的代码, http://sourceforge.net/projects/openssl-net/
      10. 使用VisualStudio打开工程后,将配置管理器中的平台改为x64后编译
      11. 此时3个dll都有了,直接部署到x64服务器即可。
  • 相关阅读:
    smtp同时发送多个邮箱
    python中smtp的账号和密码设置
    自动化测试中将文件输入到指定的文件夹
    eclipse目录中不显示输出的文件的解决办法
    运行程序提示 “ find_element () argument after * must be an iterable, not method”
    用在浏览器复制的xpath无法定位元素
    eclipse中folder、source folder
    Wampserver部署thinksns
    隐藏文件夹
    wampserver图标显示橙色或是红色的解决办法
  • 原文地址:https://www.cnblogs.com/zeroone/p/4435849.html
Copyright © 2020-2023  润新知