Emgu无法在IIS服务器中找到cvextern

时间:2017-09-12 19:22:29

标签: c# asp.net-mvc iis emgucv

我在服务器上运行Emgu时遇到了一些问题。它在本地运行良好,但是当我尝试在带有IIS的服务器上使用它时,它不起作用。

这是错误:

System.TypeInitializationException: The type initializer for 'Emgu.CV.CvInvoke' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'cvextern': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
   at Emgu.CV.CvInvoke.RedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata)\r\n   at Emgu.CV.CvInvoke..cctor()
   --- End of inner exception stack trace ---
   at Emgu.CV.CvInvoke.cvCreateImageHeader(Size size, IplDepth depth, Int32 channels)
   at Emgu.CV.Image`2.AllocateData(Int32 rows, Int32 cols, Int32 numberOfChannels)
   at Emgu.CV.Image`2.set_Bitmap(Bitmap value)
   at VerifyID.Managers.ImageTreatmentsManager.ExtractDocumentFromImage(Bitmap bitmap)
   at VerifyID.VerifyWorker.ExecuteOCR(BigIdRequest request, BigIdEvent bigIdEvent)

我在x86和x64中有以下dll:

  • concrt140.dll *
  • liblept172.dll *
  • msvcp140.dll *
  • vcruntime140.dll *
  • cvextern.dll *
  • libtesseract304.dll *
  • opencv_ffmpeg320.dll *

IIS版本:10.0

将x64 dll直接复制到构建的bin目录后,错误更改为:

System.TypeInitializationException: The type initializer for 'Emgu.CV.CvInvoke' threw an exception. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
   at Emgu.CV.CvInvoke.RedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata)
   at Emgu.CV.CvInvoke..cctor()
   --- End of inner exception stack trace ---
   at Emgu.CV.CvInvoke.cvCreateImageHeader(Size size, IplDepth depth, Int32 channels)
   at Emgu.CV.Image`2.AllocateData(Int32 rows, Int32 cols, Int32 numberOfChannels)
   at Emgu.CV.Image`2.set_Bitmap(Bitmap value)
   at VerifyID.Managers.ImageTreatmentsManager.ExtractDocumentFromImage(Bitmap bitmap)
   at VerifyID.VerifyWorker.ExecuteOCR(BigIdRequest request, BigIdEvent bigIdEvent)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

我遇到同样的问题,应用程序在本地服务器(Visual Studio使用的IIS Express)上完美运行,但在远程Windows服务器上却没有,对我有用的解决方案是:

(请在每个步骤之间测试您的应用程序,也许您不需要全部执行)

  1. 在Visual Studio中,打开应用程序项目属性并将“平台”设置为“任何CPU”。然后将您的应用程序发布到远程服务器。

  2. x86 文件夹中的所有.dll文件移至 bin 文件夹,特别注意 cvextern.dll ,它必须与你的应用程序dll并排在bin文件夹中。

  3. 在远程服务器上安装 Visual C ++ Redistributable for Visual Studio (只需google它,您就会找到下载链接。请根据您的VS版本选择下载版本,2013,2015 ,2017年,2020年,2050年......)。即使您的操作系统是x64,也请使用 x86 安装。

  4. 为应用程序激活app_pool以运行32位。 https://help.webcontrolcenter.com/kb/a1114/how-to-enable-32-bit-application-pool-iis-7-dedicatedvps.aspx

  5. 转到application \ bin文件夹,为文件夹“x86”(包含emgu的所有dll)授予文件安全性,如以下链接“http://www.iis.net/learn/manage/configuring-security/application-pool-identities中所述,如果您的apppool在在defaulapppool中使用,那么你应该添加用户“IIS AppPool \ DefaultAppPool”

  6. 我真的不知道为什么这些dll的x64版本不能在我的服务器上运行。我还在调查它,一旦我找到为什么我会更新这篇文章。

    另一种解决方案(根本不优雅,但有效)是在服务器上安装Visual Studio,执行与开发环境相同的安装过程。通过这样做,您将拥有服务器上安装的所有依赖项和dll(包括Visual C ++)。

    希望它有所帮助!