0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FlyCapture2のFlyCapture2_v140.dllを単体テストから呼ぶとクラッシュ

Last updated at Posted at 2019-08-20

問題

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でない事と、その動作が少し掴めました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?