「C Sharpの応用 - アップデート機能」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == C#において、EXEファイルやDLLファイルをアップデートを行う機能を実装したい時がある。<br> <br> ここでは、実行中の…」)
 
(文字列「</source>」を「</syntaxhighlight>」に置換)
16行目: 16行目:
  File.Delete("Application.old");
  File.Delete("Application.old");
  File.Move("Application.exe", "Application.old");
  File.Move("Application.exe", "Application.old");
  </source>
  </syntaxhighlight>
<br>
<br>
次に、新しいソフトウェアのダウンロードを行う。<br>
次に、新しいソフトウェアのダウンロードを行う。<br>
22行目: 22行目:
  <source lang="csharp">
  <source lang="csharp">
  File.Move("Application.old", "Application.exe");
  File.Move("Application.old", "Application.exe");
  </source>
  </syntaxhighlight>
<br>
<br>
新しいソフトウェアを起動する。<br>
新しいソフトウェアを起動する。<br>
30行目: 30行目:
  Process.Start("Application.exe", "/up " + Process.GetCurrentProcess().Id);
  Process.Start("Application.exe", "/up " + Process.GetCurrentProcess().Id);
  this.Close();
  this.Close();
  </source>
  </syntaxhighlight>
<br>
<br>
Main関数(ウィンドウの生成前)にて、古いソフトウェアを削除する処理を記述する。<br>
Main関数(ウィンドウの生成前)にて、古いソフトウェアを削除する処理を記述する。<br>
51行目: 51行目:
     File.Delete("Application.exe.old");
     File.Delete("Application.exe.old");
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C_Sharp]]
[[カテゴリ:C_Sharp]]

2021年11月20日 (土) 14:36時点における版

概要

C#において、EXEファイルやDLLファイルをアップデートを行う機能を実装したい時がある。

ここでは、実行中のソフトウェアからEXEファイルやDLLファイルをダウンロードして、自身を書き替える方法を記載する。


サンプルコード

アップデート機能の実装手順は以下の通りである。

  • 現在のソフトウェアの起動中に、一時的に、自身のファイル名を別のファイル名に変更する。
    例 : Application.exe -> Application.exe.old
  • 現在のソフトウェアから、新しいファイルをApplication.exeという名前でダウンロードする。
  • 現在のソフトウェアから新しいファイルに対して、コマンドライン引数として自身のpidを渡して、起動中のソフトウェアを終了する。
  • 新しいソフトウェアから、現在のソフトウェア(Application.exe.old)を削除する。


まず、自身のファイル名を一時的に変更する。

<source lang="csharp">
File.Delete("Application.old");
File.Move("Application.exe", "Application.old");
</syntaxhighlight>


次に、新しいソフトウェアのダウンロードを行う。
もし、ダウンロードに失敗した場合は、自身のファイル名を元に戻して、終了する。

<source lang="csharp">
File.Move("Application.old", "Application.exe");
</syntaxhighlight>


新しいソフトウェアを起動する。
この時、現在のソフトウェアのpidを渡す。
これは、新しいソフトウェアの起動後、現在のソフトウェアが終了するまで待機させるためである。

<source lang="csharp">
Process.Start("Application.exe", "/up " + Process.GetCurrentProcess().Id);
this.Close();
</syntaxhighlight>


Main関数(ウィンドウの生成前)にて、古いソフトウェアを削除する処理を記述する。
ここでは、コマンドライン引数の確認を簡略化している。

<source lang="csharp">
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.exe.old");
}
</syntaxhighlight>