C# .Net Frameworkでアプリケーションを再起動するコード
C# .Net framework 3.X版でアプリケーションを再起動するコードを紹介します。Windowsのアプリではファイルのロックなどもあり、設定を変えて再起動、というケースがままあると思います。UNIXとは全く違った感じのコードになります。
photostandで設定リセットメニューを実装しました。設定する項目が多くなってしまったときに、とにかく普通に動くようにしたい、ということがあるだろうと"リセット"をメニューに入れていたのですが、実装せずにグレイアウトしてあったものです。
インタラクティブなGUI付きのアプリケーションですので、通常動作ではユーザがUIで設定→機能上の設定を変更、という手順になります。逆に設定を変える(リセットする)場合は、機能上の設定を変更して→UIの表示も変更する、という逆手順になります。新たにこのコードを書き起すのは面倒くさく、バグりそうな気がしましたので、設定ファイルを破棄して、アプリケーションを再起動することにしました。
さて、ググると、最初に見つかったのは、System.Diagnostics.Process.Restart。しかし、ヘルプの中には見つかりません。どうやら、バーション2.Xではあったものが、既になくなっているようです。さらに調べると、以下のようなコードが見つかりました。
// Get the parameters/arguments passed to program if any
string arguments = string.Empty;
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++) // args[0] is always exe path/filename
arguments += args[i] + " ";
// Restart current application, with same arguments/parameters
Application.Exit();
System.Diagnostics.Process.Start(Application.ExecutablePath, arguments);
.Netでは、Exit()をコールした後に、コードを書けるんですね。ということで、このままのコードで動きました。このアプリは2重起動をチェックしているのですが、テストでは特に引っかかりません。
ちなみに、UNIX/Cで書くと、以下のような感じでしょうか。
pid = fork();
if (pid == 0) {
execl("アプリケーションのパス", NULL);
_exit(1);
} else if (pid > 0) {
signal(SIGCHLD, SIG_IGN); // ないほうが良い?
_exit(0);
}
実際には2重起動のチェックを回避するために、同期するかウェイトを入れないとならないでしょう。もしかすると、上記でforkなしでexeclしてしまっても構わないような気もしますが、何かのリソース上の問題があるような気もします。