質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

6137閲覧

OpenCVのdllの保存場所について

Kato

総合スコア4

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2022/02/04 01:56

以下の開発環境において, C#(WPF)でOpenCVを用い画像表示を行うプログラムを作成しております.

開発環境

OS : Windows10 Pro (Version 20H2)
CPU: Intel Core i5-8365U
MEM: 8GB

ツール: Visual Studio 2019 (Version 16.7.3)
OpenCV: OpenCvSharp4 (v4.5.3.20210817)
OpenCvSharp4.runtime.win ( 〃 )
OpenCvSharp4.Windows ( 〃 )
OpenCvSharp4.WpfExtensions ( 〃 )

前提

コンパイル後, 生成されたEXEファイルとOpenCV関係のdllファイルが以下のように保存され, OpenCV関係の命令は正常に実行できます.
EXEファイル
OpenCvSharp.dll
OpenCvSharp.Extensions.dll
OpenCvSharp.WpfExtensions.dll
\dll\x64\opencv_videoio_ffmpeg453_64.dll
\dll\x64\OpenCvSharpExtern.dll
\dll\x86\opencv_videoio_ffmpeg453_64.dll
\dll\x86\OpenCvSharpExtern.dll

やりたいことに対して試したこと

EXEファイルと同じ階層に他にもdllがあり, フォルダ内を整理したいため, コンパイル時の設定で以下のようなフォルダ構成になるようコマンドを組んでおります.
EXEファイル
\dll\soft\OpenCvSharp.dll
\dll\soft\OpenCvSharp.Extensions.dll
\dll\soft\OpenCvSharp.WpfExtensions.dll
\dll\soft\x64\opencv_videoio_ffmpeg453_64.dll
\dll\soft\x64\OpenCvSharpExtern.dll
\dll\soft\x86\opencv_videoio_ffmpeg453_64.dll
\dll\soft\x86\OpenCvSharpExtern.dll

また, Visual Studio 2019 のプロジェクト中のApp.config に
https://docs.microsoft.com/ja-jp/dotnet/framework/configure-apps/file-schema/runtime/probing-element を参考にして,
<probing privatePath="dll\soft;dll\soft\x64;dll\soft\x86"/>
を追記しております.

問題

コンパイル後, 上記のフォルダ構造になっている状態で, EXEファイルを実行させると,
OpenCvSharpExtern.dllが見つからないことに起因するエラーが出て,
OpenCV関係の命令が正常に実行できなくなりました.

相談事項

OpenCV関係のdllファイルをEXEファイルと同じ階層に作成したサブフォルダにおいて
実行させる方法はありますでしょうか.

情報が少ない場合,可能な限りで追加させて頂きます.
どうぞお知恵をお貸し頂けますようお願い致します.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

「opencvsharp/src/OpenCvSharp/Internal/PInvoke/WindowsLibraryLoader.cs 」
https://github.com/shimat/opencvsharp/blob/master/src/OpenCvSharp/Internal/PInvoke/WindowsLibraryLoader.cs

を見た感じだと、マネージド dll が存在している場所から見て、dll/x64 とか dll/x86 にネイティブ dll を置く必要がありそうです。なので

\dll\soft\dll\x64\opencv_videoio_ffmpeg453_64.dll
\dll\soft\dll\x64\OpenCvSharpExtern.dll
\dll\soft\dll\x86\opencv_videoio_ffmpeg453_64.dll
\dll\soft\dll\x86\OpenCvSharpExtern.dll

に配置すればよさそうです。

これらの Path は privatePath に含める必要は無いと思います。

追記

プロービングのパスを
<probing ="dll\soft"/>

フォルダ構成を

EXEファイル
\dll\soft\OpenCvSharp.dll
\dll\soft\OpenCvSharp.Extensions.dll
\dll\soft\OpenCvSharp.WpfExtensions.dll
\dll\soft\dll\x64\opencv_videoio_ffmpeg453_64.dll
\dll\soft\dll\x64\OpenCvSharpExtern.dll
\dll\soft\dll\x86\opencv_videoio_ffmpeg453.dll
\dll\soft\dll\x86\OpenCvSharpExtern.dll

にしてみてください。

投稿2022/02/04 03:07

編集2022/02/07 17:42
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kato

2022/02/05 05:55

コメント頂き有難うございました。 コンパイル時の設定で、上記のやりたいフォルダ構造なるようコマンドを組んだ状態で、アドバイス頂いた通りApp.config中の記載からprobing privatePath の記述を削除しました。 コンパイル後作られた環境でEXEファイルを実行すると、 System.IO.FileNotFoundException: ファイルまたはアセンブリ'OpenCvSharp.WpfExtensions, version=1.0.0.0, culture=natural, PublicKeyTaken=null'、またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。 と出ている状態です。 OpenCVのdllは任意のフォルダに保管して運用することは無理なのでしょうか?
KOZ6.0

2022/02/05 11:15

<probing privatePath="dll\soft;dll\soft\x64;dll\soft\x86"/> これ全部消しちゃいました?
KOZ6.0

2022/02/05 17:42

うーん、説明不足か・・・ マネージドの DLL OpenCvSharp.dll OpenCvSharp.Extensions.dll OpenCvSharp.WpfExtensions.dll を探すのに \dll\soft\ の記述は必要です。 ですが、ネイティブ dll の検索は必要ないだろうってことです。
Kato

2022/02/06 10:40 編集

お休みのところ、コメント頂き本当に有難うございます!!! <probing ="dll\soft"/> を追記しますと、 2022/02/05 14:55 に上げさせて頂いた OpenCvSharp.WpfExtensions.dll に関するメッセージは出て来なくなりました。 おそらく 他の二つのOpenCvSharp.dll、 OpenCvSharp.Extensions.dll は読み込めたと思われます。 ところが、 System.TypeInitilizationException: ’OpenCvSharp.Internal.NativeMethods'のタイプ初期化が例外をスローしました。---> System.DllNotFoundException:DLL 'OpenCvSharpExtern'を読み込めません:指定されたモジュールが見つかりません。 と出るようになりました。 dll\soft\x86 に保管しているOpenCvSharpExtern.dll が読み込めていないと考え、 <probing ="dll\soft;dll\soft\x86"/> と追記しましたが、同じくOpenCvSharpExtern が読み込めない とのメッセージが出ている状況です。 ただ、x86フォルダをdll\softフォルダに移動せず、dllフォルダに置いたままにすると、うまく動作させることができました。 理想は、x86フォルダもsoftフォルダに移動させて運用したいと考えております。 まだお知恵をお貸し頂けるようでしたら、どうぞ宜しくお願い致します。
KOZ6.0

2022/02/06 11:48

OpenCvSharpExtern.dll opencv_videoio_ffmpeg453_64.dll をどこに置けばいいか、もう一度回答を見直してもらえますか?
Kato

2022/02/07 16:04

お休みのところ、コメント頂いておりまして本当に有難うございます!!! 本日は他業務のため、あまり検討する時間がありませんでした。 OpenCvSharpExtern.dll、opencv_videoio_ffmpeg453.dll (32bitでコンパイルしているため、x86フォルダのもの,一番初めに記載したものは誤記でした) をdll\x86フォルダに置かず、生成したEXEファイルと同じ階層に置くと正常に動作しました。 簡単な記述で実現するには、dll\x86 フォルダに置いたままにするか、EXEファイルと同じ階層に置くしかないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問