意味不明な実行時例外

C#でプログラムを書くときに、コンストラクタでは例外をスローしないように注意しています。たとえとば、ファイルのIOやデータベースの接続などはそれらのコンストラクタではしないようにしています。

ところが、今回作ったアプリケーションで開発環境以外ではコンストラクタ内の実行時例外がスローされて起動しないという現象が発生しました。一つ一つ調べていくも原因がわからず…。

(実行時例外の内容は

Faulting application アプリケーション名, version 0.0.0.0, stamp 4d69b86e, faulting module kernel32.dll, version 5.2.3790.4480, stamp 49c51f2f, debug? 0, fault address 0x0000bef7.

image

コンストラクタというと、”public クラス名() "だけを思い浮かべがちですが、フィールドを初期化している場合もコンストラクタ内での初期化処理に該当します。このことになかなか気づかず、あれやこれやと調べてみてようやく原因を特定しました。

ただ、今回の実行時例外はこれだけではありませんでした。発生場所がlog4netを宣言するSataicフィールドだったのです。あり得ないことだよな…と思いlog4net以外の可能性を考えたのですが、様々な自称がlog4netが原因だと指し示しています。まさにシャーロックホームズの言う、可能性を排除した上で残った事象が真実という状態でした。

log4netが原因かどうか明確にするため、実行時例外が発生する環境へVisualStudioをインストールし実際に実行してみました。そうすると、そのものずばりlog4netの宣言部で例外が発生していました。

ここまでで、現象は明確になったのですが、原因はわかっていません。現象はlog4netのインスタンスを生成時に実行時例外が発生すると言うことです。

ただ、log4netはこれまでも.NET Framework4.0で使用してきておりlog4net自体の問題でないことは明らかです。とすると環境が悪いのか…?ただ、実行時例外がスローされる環境ではコマンドラインアプリケーションなどは問題なく動作します。

何気なく開発環境のlog4netのプロパティをVisualStuioで確認しました。参照先のフォルダが…GACになっているではないですか…。ホントに??ですが、実行時例外がスローされる環境ではGACにlog4netはインストールしていません。そのため、log4netがGACにインストールされていない環境ではlog4netが見つからないため例外がスローされたと考えられます。

うーん、開発環境のGACへlog4netを登録したことはないはずなのですが、確かに存在しておりそちらを参照していました。ここをフォルダ内の参照へ変更することで無事問題は解決しました。

image