OpenCvSharp で64ビット用のOpenCVを用いると TypeInitializationException が発生する - C#

OpenCvSharpでOpenCVのx64(64ビット)用のDLLを用いるとTypeInitializationException例外が発生することがあります。

概要

TypeInitializationException例外が発生し
'OpenCvSharp.NativeMethods' のタイプ初期化子が例外をスローしました。
の追加情報が表示されます。

原因

WindowsFormアプリやコンソールアプリのアプリケーションのデフォルトの設定では32ビットを優先して利用する動作になっています。このためビルドされたアプリケーションは32ビットアプリケーションとして実行されます。そのため32ビットアプリから64ビットのOpenCVのDLLを読み込もうとしてエラーになるようです。

対策

ソリューションエクスプローラでプロジェクトのノードを選択し、右クリックのポップアップメニューの[プロパティ]を選択しプロジェクトの設定画面を表示します。設定画面の左側のカテゴリメニューから[ビルド]をクリックして選択します。(下図)


対策は以下の2つの方法があります。

32ビット優先を外す

デフォルトでは[32 ビットの優先]チェックボックスにチェックがついていますので、このチェックボックスのチェックを外します。

64ビットを明示的に指定する

プラットフォームターゲットのコンボボックスはデフォルトでは"Any CPU"が選択されています。これを"x64"に変更します。



上記設定の変更によりTypeInitializationException例外の発生は解消します。

補足 (その他の原因)

OpenCVのDLLを出力ディレクトリにコピーせず、OpenCVのDLLが見つからない場合も同様のエラーが発生します。この原因の場合はDLLが32ビット版でも発生します。ソリューションエクスプローラでDLLファイルのプロパティ[出力ディレクトリにコピー]を"コピーしない"から"常にコピーする"または"新しい場合はコピーする"に変更します。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2014-04-08
iPentec all rights reserverd.