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友好的對象封裝方式測試

 

而這個錯誤通常由如下兩點緣由形成的: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.

  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. 執行 ms\do_ms
  7. 用文本編輯器打開 ms目錄下的 ntdll.mak. 將CFLAG中的 /MD 標識符改爲 /MT
  8. 回到命令提示符下,繼續執行 nmake -f ms\ntdll.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. 執行 ms\do_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=inc64\openssl
    7. 回到命令提示符下,繼續執行 nmake -f ms\ntdll.mak 編譯
    8. openssl編譯成功後,就能夠在out64dll目錄下找到這2個DLL了。
    9. 使用GIT客戶端下載最新的 OpenSSL.Net的代碼, http://sourceforge.net/projects/openssl-net/
    10. 使用VisualStudio打開工程後,將配置管理器中的平臺改成x64後編譯
    11. 此時3個dll都有了,直接部署到x64服務器便可。
相關文章
相關標籤/搜索