とあるアプリケーション(WPFアプリ)がようやく出来あがったので、インストーラーを作成。試しに別のPCへインストールしてみたら、起動しない。。。
これがエラーメッセージを吐くでもなく、とにかく起動しない。タスクマネージャーで見ると、一瞬プロセスは現れるんだけど、すぐに消えてしまう。どうもウィンドウを表示する以前の問題っぽい。何台かのPCで試してみると、同じ現象のPCが複数ある。起動するPCもあるので何か条件はありそう。でもなぁ、エラーも出ないようだと処置なしである。
例外をログに書き出す
ウィンドウの表示前、もしくは途中でエラーになっていそうなので、例外を捕まえて書き出してみることにする。WPFアプリケーションが起動する時のイベントあったよなと、記憶をたどりつつ処理を追加してみる。
App.xaml.cs でOnStartup()をオーバーライドして、try~catchでメインウィンドウの表示処理を挟んで記述する。これでメインウィンドウの表示関係の例外は取り出せるはず。
protected override void OnStartup(StartupEventArgs e)
{
// 実行ファイルと同じ名前、パスにログファイルを書き出す
var fullPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
var appPath = System.IO.Path.GetDirectoryName(fullPath);
var fname = System.IO.Path.GetFileNameWithoutExtension(fullPath);
var logFile = appPath + $@"{fname}.log";
string appendText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + Environment.NewLine;
appendText += "-Start----------------" + Environment.NewLine;
System.IO.File.AppendAllText(logFile, appendText);
try
{
// メイン ウィンドウ表示
MainWindow window = new MainWindow();
window.Show();
}
catch (Exception ex)
{
appendText += "----------------------" + Environment.NewLine;
appendText += "Text: " + ex.ToString() + Environment.NewLine;
appendText += "----------------------" + Environment.NewLine;
// log
System.IO.File.AppendAllText(logFile, appendText);
}
}
で、やってみたら見事にログが取れた。単に使っているDLLをインストーラーに入れ忘れていたのが原因。そりゃPCによって現象が出たり出なかったりする訳である。
しかし、なぜかメインウィンドウが2つ表示される
ログの処理を追加したら、なぜかメインウィンドウが2つ表示されるようになってしまった。OnStartUp()をオーバーライドしているのになぜ???
調べたらApp.xmlでメインウィンドウを指定してんだね。こことオーバーライドしたOnStartup()で2重にメインウィンドウを表示していたっぽい。
<Application x:Class="MyApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Views/MainWindow.xaml"> ⇐ この行が原因この行を削って下のようにしてみたら解決。
<Application x:Class="MyApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml">
あとはインストーラーを作り直したら解決だ。