在 Server 2012 的 IIS 執行 TesseractOcr 出現 DLLNotFoundException 錯誤的問題

最近正進行一個案子,將OCR搬至IIS中執行,並以 ASP.NET Web API 方式提供服務,但是就佈署到 Windows Server 2012 R2中執行的時候卻發生OCR方法呼叫失敗的錯誤訊息

前言

最近正進行一個案子,將OCR搬至IIS中執行,並以 ASP.NET Web API 方式提供服務,但是就佈署到 Windows Server 2012 R2中執行的時候卻發生OCR方法呼叫失敗的錯誤訊息,查看Log資訊如下:

問題解決

根據Log中的資訊可以發現,最後引發錯誤的是「InteropDotNet.LibraryLoader.LoadLibrary(String fileName, String platformName)」因此產生「Failed to find library "liblept172.dll" for platform x86.」的訊息,而我知道「liblept172.dll」是實際 OCR 的實作部分的DLL且由VC++撰寫,TesseractOcr 它的運作其實是有人使用 C# 撰寫了一個讓 .NET 應用程式使用的 Wrapper,所以這個 C# Library 其實也都是透過 DllImport 去呼叫「liblept172.dll」與「libtesseract304.dll」這兩個DLL。

但這個錯誤,我第一個想到的是,我的 IIS AppPool 的「啟用 32 位元應用程式」是開啟的阿?為什麼會 LoadLibrary 失敗呢?

 那究竟是什麼原應導致這個問題,案情這時候陷入膠著狀態,但身為 Trouble-shooting 的老手怎可就此打敗,這時想到拿出 Dependency Walker 這套察看 C++ DLL 相依性的工具來看看「liblept172.dll」與「libtesseract304.dll」這兩個DLL 倒底還相依了哪些DLL。

這時馬上讓我想到我還沒裝「Microsoft Visual C++ 2015 Redistributable runtime for x86.」這個套件,因為上面相依到了「VCRUNTIME140.DLL」,而且,透過 Google 搜尋錯誤內容的相關資訊,也都指向當沒有安裝 VC++ Runtime 時,就會發生「Failed to find library "liblept172.dll"」,且是最後就是發生在「InteropDotNet.LibraryLoader.LoadLibrary(String fileName, String platformName)」這個方法。

註:liblept168.dll 是因為他使用較舊版本的 Tesseract Ocr 元件。

 

立即搜尋 Google 找到「Microsoft Visual C++ 2015 Redistributable runtime」

因為我們啟用 32位元應用程式,所以我只需要安裝「vc_redist.86.exe」即可!於是,本案宣告破解!

 

參考資料:

https://github.com/charlesw/tesseract/issues/172

https://github.com/charlesw/tesseract/issues/181

http://stackoverflow.com/questions/36480823/tessnet2-in-webforms-net-returns-dllnotfoundexception-liblept172-dll

https://www.microsoft.com/zh-TW/download/details.aspx?id=48145

 

 


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^