.NETでアプリを実行しても起動しない場合はイベントログを確認

今直面している問題が、.NETで開発したアプリをテスト機など開発環境以外へ持って行った場合に初期画面さえ表示されず実行もされないという問題です。この手の話は、だいたい使用しているアプリのライセンスや参照しているDLLが参照できないためにコンストラクタで例外がスローされているというケースが多いと思います。

とはいうものの、なかなか久しぶりだとこの状況は焦ります。何せ万全を期してテストを行ったアプリが開発環境以外では実行されないって、正直あまり想定していないですから。

動かないのは設定間違いか? → ログを見ればわかるだろう! → ログを見ても何も出力されていない

という状況を見るとなおのこと焦ります。運良くエントリポイントでログが出力さていても、その内容は当てにならないことが多いのではないかと思います。

また、このような状況で仮にテスト環境へVisualStudioをインストールなぞしてみて実行してみると、エントリポイント後に呼ばれるクラスのインスタンス生成時(コンストラクタ)で意味不明な実行時例外が出力されると思います。

冷静に考えると当たり前ですが、こういう時に確認するべきは 管理ツールにある イベントログ ですね。イベントログはWindowsのログを集約しているので、システムまたはアプリケーションに関するログを一元管理してくれています。従って、よくわからないときはイベントログを見るというのは基本動作として身につけるべき事です。

(前回のプロジェクトも同様の現象が発生したにも関わらず、今回すぐにここにたどり着けなかったので、このエントリを書いているわけですが…)

イベントログにはだいたい下記のように KERNELBASE.dll の障害が表示されますが、通常業務アプリが KERNELBASE.dll へ影響を及ぼして障害が発生するようなことはほとんどないと思います。

障害が発生しているアプリケーション名: hoge.exe、バージョン: 2.2.4.0、タイム スタンプ: 0x99999999
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 6.1.7600.16385、タイム スタンプ: 0x99999999
例外コード: 0xe0434352
障害オフセット: 0x0000b727
障害が発生しているプロセス ID: 0x99999
障害が発生しているアプリケーションの開始時刻: 0x999999999999999
障害が発生しているアプリケーション パス: C:...\hoge.exe
障害が発生しているモジュール パス: C:\Windows\syswow64\KERNELBASE.dll
レポート ID: eb9999...

ここまで確認できたら、どの参照が読み込めていないのかを確認して、適切な参照が行えるように設定を行うことになります。ただ、検証機の環境だけがうまく動作しないと言うこともまれにあるので、その辺の切り分けは適切に行う必要がありますが…。

参照については、実行時にどのような順序でDLLを読み込むのかと言うことが解決のヒントになると思いますが、その辺は時間のあるときにメモしておこうと思います。