OpenSSL.Net 在生产环境中无法正常加载的原因分析与解决方式。
2011-11-19 00:51
501 查看
在本地测试好好的代码部署到生产环境后,遇到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.dll和ssleay32.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.
首先安装 ActivePerl http://www.activestate.com/activeperl/downloads
从http://www.openssl.org/下载最新的openssl源代码包
在开始菜单中找到 Visual Studio 的命令提示符(Visual Studio Command Prompt),也就是vcvarsall.bat设置好x86编译需要环境变量
在命令提示符窗口中 切换到下载的openssl源代码包的位置
执行 perl configure VC-WIN32
执行 ms\do_ms
用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
编译成功后,就可以在out32dll目录下找到这2个DLL了, 替换掉原有的即可。
2. x64操作系统的问题
如果服务器是x64操作系统,如Windows 2008 R2, 那么由于这些dll都是x86环境下的,也会导致加载失败。
对于这类问题最简单的解决办法是,修改IIS应用程序池的设置,允许32bit代码的执行。这种方式并不好,实际上进程被限制在WOW64上运行,对性能会有影响。
最好还是编译一套x64版本的dll,这样无需修改任何IIS设置也可保证运行。
在开始菜单中找到 Visual Studio 的x64环境命令提示符(Visual Studio x64 Cross Tools Command Prompt ),也就是vcvarsall.bat设置好x64编译需要环境变量
在命令提示符窗口中 切换到下载的openssl源代码包的位置
执行 perl configure VC-WIN64A
执行 ms\do_win64a
用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
继续修改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=inc64\openssl
回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
openssl编译成功后,就可以在out64dll目录下找到这2个DLL了。
使用GIT客户端下载最新的 OpenSSL.Net的代码, http://sourceforge.net/projects/openssl-net/
使用VisualStudio打开工程后,将配置管理器中的平台改为x64后编译
此时3个dll都有了,直接部署到x64服务器即可。
这里是使用VS2010编译后的文件下载:http://download.csdn.net/detail/wangjia184/3812878
openssl版本 1.0.0e, openssl.net版本 0.5-rc1
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.dll和ssleay32.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.
首先安装 ActivePerl http://www.activestate.com/activeperl/downloads
从http://www.openssl.org/下载最新的openssl源代码包
在开始菜单中找到 Visual Studio 的命令提示符(Visual Studio Command Prompt),也就是vcvarsall.bat设置好x86编译需要环境变量
在命令提示符窗口中 切换到下载的openssl源代码包的位置
执行 perl configure VC-WIN32
执行 ms\do_ms
用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
编译成功后,就可以在out32dll目录下找到这2个DLL了, 替换掉原有的即可。
2. x64操作系统的问题
如果服务器是x64操作系统,如Windows 2008 R2, 那么由于这些dll都是x86环境下的,也会导致加载失败。
对于这类问题最简单的解决办法是,修改IIS应用程序池的设置,允许32bit代码的执行。这种方式并不好,实际上进程被限制在WOW64上运行,对性能会有影响。
最好还是编译一套x64版本的dll,这样无需修改任何IIS设置也可保证运行。
在开始菜单中找到 Visual Studio 的x64环境命令提示符(Visual Studio x64 Cross Tools Command Prompt ),也就是vcvarsall.bat设置好x64编译需要环境变量
在命令提示符窗口中 切换到下载的openssl源代码包的位置
执行 perl configure VC-WIN64A
执行 ms\do_win64a
用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
继续修改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=inc64\openssl
回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
openssl编译成功后,就可以在out64dll目录下找到这2个DLL了。
使用GIT客户端下载最新的 OpenSSL.Net的代码, http://sourceforge.net/projects/openssl-net/
使用VisualStudio打开工程后,将配置管理器中的平台改为x64后编译
此时3个dll都有了,直接部署到x64服务器即可。
这里是使用VS2010编译后的文件下载:http://download.csdn.net/detail/wangjia184/3812878
openssl版本 1.0.0e, openssl.net版本 0.5-rc1
相关文章推荐
- OpenSSL.Net 在生产环境中无法正常加载的原因分析与解决 z
- 在命令行下编译通过,运行时提示错误:找不到或无法加载主类的原因分析与解决方式
- UAT环境正常,上线生产环境后访问不到数据的原因分析及问题解决
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
- windows XP系统无法正常启动的原因分析及解决
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
- win7开机提示系统自动修复无法正常进入的原因分析及解决
- flex 调试无法正常启动原因分析及解决方法
- html中frameset标签无法正常显示原因分析及解决
- asp.net"访问被拒绝,程序集无法加载"原因与解决方法[摘录]
- 多线程环境下JDBC驱动加载导致线程阻塞问题的分析、解决和深入学习
- 应用程序无法正常启动提示错误0xc000007b 问题的原因和解决方法
- net2003 "visual studio.net 无法加载,因为无法加载MSXML3.DLL文件"的解决办法
- Cinder无法连上CEPH集群原因分析和解决
- C#.NET验证码智能识别学习笔记---06 解决java jre问题:JTessBoxEditor.jar打开的时报找不到或无法加载主类 com.sun.tools.javac.Main错误
- Win8修改锁屏壁纸后无法正常显示壁纸的原因及解决方法
- IE6不能正常解析CSS文件问题的解决方法及原因分析
- 分析解决:XXX驱动已经被编译到缺省内核中,不能再使用insmod 方式加载
- Win8系统下U盘无法格式化的原因分析及解决方法
- win7下安装oracle11G系列之四:解决生产环境无法建表问题