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.dll和ssleay32.dll 進行包裝的Assembly.性能
它經過P/Invoke調用openssl的dll導出函數,並提供對.Net友好的對象封裝方式測試
而這個錯誤通常由如下兩點緣由形成的:spa
1. libeay32.dll 和 ssleay32.dll 這兩個動態庫使用動態連接VC Runtime的方式編譯的,由於服務器上沒有安裝VC++ Runtime而致使加載失敗。操作系統
2. 服務器操做系統是x64,而這些動態庫倒是x86的,致使加載失敗。.net
對於這兩個緣由,下面逐步說明解決方式。orm
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服務器便可。