問題
FlyCapture2のFlyCapture2Ⅾd_v140.dllを単体テストから呼ぶとクラッシュしてしまう。
現在WPF+C#デスクトップアプリからFlyCaptureSDKを用いてカメラから画像取得しております。
サンプルに従いアプリでは参照にFlyCapture2GUI_Managedd_v140.dll
を追加し、
実行ファイルのパスにFlyCapture2d_v140.dll
をコピーするようにしました。
この状態でこれらを使うクラスを単体テストから呼び出すとFlyCapture2d_v140.dll
を読み込んだ時点でtesthost.exeが黙って落ちました。
対処法
参照dllをFlyCapture2GUI_Managed_v140.dll
コピーするdllをFlyCapture2_v140.dll
に変更します。
(分かりにくいですが_v140の前のdが無い方です。)
経緯
問題の起きた時、Windowsのイベントビューワに残るログは以下のものでした。
障害が発生しているアプリケーション名: testhost.exe、バージョン: 15.0.0.0、タイム スタンプ: 0x92c7181e
障害が発生しているモジュール名: FlyCapture2d_v140.dll、バージョン: 2.13.3.61、タイム スタンプ: 0x5ca574f7
例外コード: 0x80000003
障害オフセット: 0x0000000001178210
障害が発生しているプロセス ID: 0x98
障害が発生しているアプリケーションの開始時刻: 0x01d556344949e967
障害が発生しているアプリケーション パス: C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\Extensions\TestPlatform\testhost.exe
障害が発生しているモジュール パス: C:\Program Files\Point Grey Research\FlyCapture2\bin64\vs2015\FlyCapture2d_v140.dll
レポート ID: b7cc00c9-8fd6-49e4-9aa3-4aa73ed9bb79
障害が発生しているパッケージの完全な名前:
障害が発生しているパッケージに関連するアプリケーション ID:・・・・
この例外コード: 0x80000003
で調べてみるとこんなページが引っかかりました。
ここによればエラーコードの意味はSTATUS_BREAKPOINTだそうです。
サンプルコードのビルドイベントコマンドを眺めていると、どうやらDebungとReleaseでdllを呼び変えてました。
あ、Debug用じゃない方にすればBREAKPOINT引っかからないんじゃね?と思い呼び出すdllを変更しました。
IF $(Platform)==x86 (
copy "$(ProjectDir)..\..\bin\vs2015\libiomp5md.dll" "$(TargetDir)"
IF $(ConfigurationName)==Debug (
copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\bin\vs2015\$(TargetName)d_v140$(TargetExt)"
copy "$(ProjectDir)..\..\bin\vs2015\FlyCapture2d_v140.dll" "$(TargetDir)"
) ELSE (
copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\bin\vs2015\$(TargetName)_v140$(TargetExt)"
copy "$(ProjectDir)..\..\bin\vs2015\FlyCapture2_v140.dll" "$(TargetDir)"
)
) ELSE IF $(Platform)==x64 (
copy "$(ProjectDir)..\..\bin64\vs2015\libiomp5md.dll" "$(TargetDir)"
IF $(ConfigurationName)==Debug (copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\bin64\vs2015\$(TargetName)d_v140$(TargetExt)"
copy "$(ProjectDir)..\..\bin64\vs2015\FlyCapture2d_v140.dll" "$(TargetDir)"
) ELSE (
copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\bin64\vs2015\$(TargetName)_v140$(TargetExt)"
copy "$(ProjectDir)..\..\bin64\vs2015\FlyCapture2_v140.dll" "$(TargetDir)"
)
)
IF $(Platform)==x86 (
copy "$(ProjectDir)..\..\bin\vs2015\libiomp5md.dll" "$(TargetDir)"
copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\bin\vs2015\$(TargetName)_v140$(TargetExt)"
copy "$(ProjectDir)..\..\bin\vs2015\FlyCapture2_v140.dll" "$(TargetDir)"
) ELSE IF $(Platform)==x64 (
copy "$(ProjectDir)..\..\bin64\vs2015\libiomp5md.dll" "$(TargetDir)"
copy "$(TargetDir)$(TargetFileName)" "$(ProjectDir)..\..\bin64\vs2015\$(TargetName)_v140$(TargetExt)"
copy "$(ProjectDir)..\..\bin64\vs2015\FlyCapture2_v140.dll" "$(TargetDir)"
)
DebugだろうがReleaseだろうがRelease用dllを呼び出すように変更しました。
これによって何かDebug動作に支障が出るのかは不明ですが、今のところは問題なく使えております。
単体テストのスレッド
MsTestで発生して色々調べていたら、TestではSTAとは違う動作になるとの事で、これは後付けカメラを使うとき中々に引っかかりそうだ!と思いました。
で、さらにXunit.StaFactでSTAっぽく動かせるという情報を見つけまして、試してみましたがこれもだめでした。
結果的に寄り道でしたが、単体テストがSTAでない事と、その動作が少し掴めました。