2009/01/24(Sat)アプリケーションのアップデート機能を実装するには

2009/01/24 16:50 Languages::C#
C#でexeをアップデートする機能を実装したかったのだが、実行中のアプリからダウンロードする処理はいいとして、どうやれば自分自身を書き替えたらいいのか……というTips。

ほとんど参考文献に書いてあることを書いただけなんだけど…。
大まかな手順は
  • 旧アプリ起動中に、自分自身の名前を一旦別のものに変更(Application.exe -> Application.old)
  • 旧アプリから、新アプリをApplication.exeという名前でダウンロード
  • 旧アプリから新アプリに引数で自分のpidを渡し、終了する
  • 新アプリは、旧アプリを削除する(Application.old)

  1. まず、ダウンロード処理する前に、
    File.Delete("Application.old");
    File.Move("Application.exe", "Application.old");
    
    として、自分自身の名前をいったん変えます。
  2. ダウンロード処理を行います。
    成功した場合は次のステップへ、失敗した場合は、
    File.Move("Application.old", "Application.exe");
    
    として、元に戻しておきます。
  3. 新しいアプリを起動します。このとき、旧アプリのpidを渡します。
    新しいアプリ起動後、古いアプリが終了するまで待機させるためです。
    Process.Start("Application.exe", "/up "+Process.GetCurrentProcess().Id);
    this.Close();
    
  4. Program.csのstatic void Main()辺りが良いでしょうか。
    ウィンドウが作られる前に旧アプリの掃除コードを書いておきます。
    サンプルのため、引数のチェックを簡略化してますが、きちんとやる方がいいでしょう。
    if (Environment.CommandLine.IndexOf("/up", StringComparison.CurrentCultureIgnoreCase) != -1) {
        try {
            string[] args = Environment.GetCommandLineArgs();
            int pid = Convert.ToInt32(args[2]);
            Process.GetProcessById(pid).WaitForExit();    // 終了待ち
        } catch (Exception) {
        }
        File.Delete("Application.old");
    }
    

参考:
MATSYSTEM.NET ≫ Blog Archive ≫ アップデート機能