我在服务器上运行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:
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)
有人可以帮忙吗?
答案 0 :(得分:2)
我遇到同样的问题,应用程序在本地服务器(Visual Studio使用的IIS Express)上完美运行,但在远程Windows服务器上却没有,对我有用的解决方案是:
(请在每个步骤之间测试您的应用程序,也许您不需要全部执行)
在Visual Studio中,打开应用程序项目属性并将“平台”设置为“任何CPU”。然后将您的应用程序发布到远程服务器。
将 x86 文件夹中的所有.dll文件移至 bin 文件夹,特别注意 cvextern.dll ,它必须与你的应用程序dll并排在bin文件夹中。
在远程服务器上安装 Visual C ++ Redistributable for Visual Studio (只需google它,您就会找到下载链接。请根据您的VS版本选择下载版本,2013,2015 ,2017年,2020年,2050年......)。即使您的操作系统是x64,也请使用 x86 安装。
为应用程序激活app_pool以运行32位。 https://help.webcontrolcenter.com/kb/a1114/how-to-enable-32-bit-application-pool-iis-7-dedicatedvps.aspx
转到application \ bin文件夹,为文件夹“x86”(包含emgu的所有dll)授予文件安全性,如以下链接“http://www.iis.net/learn/manage/configuring-security/application-pool-identities中所述,如果您的apppool在在defaulapppool中使用,那么你应该添加用户“IIS AppPool \ DefaultAppPool”
我真的不知道为什么这些dll的x64版本不能在我的服务器上运行。我还在调查它,一旦我找到为什么我会更新这篇文章。
另一种解决方案(根本不优雅,但有效)是在服务器上安装Visual Studio,执行与开发环境相同的安装过程。通过这样做,您将拥有服务器上安装的所有依赖项和dll(包括Visual C ++)。
希望它有所帮助!