Emgu opencv ラッパーの形式でアンマネージ ライブラリを使用する Web アプリケーション (C# .NET) を構築しています。ビルドを強制的に 32 ビット (x86) にし、32 ビット バージョンの Emgu を使用しています。
これはすべてローカル ビルドでは問題なく動作しますが、Web サーバーに公開すると、openCV Dll(s) の読み込みに失敗します。
System.DllNotFoundException
Unable to load DLL 'opencv_core240': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
System.TypeInitializationException: The type initializer for 'Emgu.CV.CvInvoke' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'opencv_core240': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
at Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata)
at Emgu.CV.CvInvoke..cctor()
--- End of inner exception stack trace ---
at Emgu.CV.CvInvoke.cvCreateImageHeader(Size size, IPL_DEPTH 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 Emgu.CV.Image`2..ctor(Bitmap bmp)
stackoverflow やその他のソースで見つけた次のことを試しました。
- 管理されていない Opencv Dll を別のディレクトリに置き、このディレクトリへのパスをパス環境変数に入れ、Web サービスを再起動します。
- サーバー構成でアンマネージ コードの実行が許可されているかどうかをテストしました (はい)。
- 管理されていない Opencv Dll を system32\inetsrv および SysWOW64\inetsrv ディレクトリに配置する
- 管理されていないOpencv Dllを、前述のフォルダーのサブディレクトリ「x86」に配置します
私はこれを理解しています: http://msdn.microsoft.com/en-us/library/ms366723.aspx
これがすべての問題の原因ですが、path 変数を編集して Dll を含む正しいパスを含めても何も解決しない理由がわかりません。
この問題に関する最後の有用な投稿は 2008 年でしたが、誰にでもできる解決策はまだ提供されていません。