13,005
回編集
(ページの作成:「== 概要 == 開発中はAssemblyVersionでアスタリスク (*) を使用して、各ビルドの追跡を容易にする。<br> <br> 製品リリース時には、両方のバージョンを明示的な数値に固定する。<br> メジャーアップデートや互換性に影響する変更を行う場合は、AssemblyVersionを適切にインクリメントする<br> <br> この2つのバージョン管理を適切に行うことにより、アプリケーシ…」) |
|||
38行目: | 38行目: | ||
一方、AssemblyFileVersionは純粋に情報提供目的であり、アプリケーションの動作には影響を与えない。<br> | 一方、AssemblyFileVersionは純粋に情報提供目的であり、アプリケーションの動作には影響を与えない。<br> | ||
製品管理やユーザサポートで使用される。<br> | 製品管理やユーザサポートで使用される。<br> | ||
<br><br> | |||
== 使用例 : アプリケーション更新プログラム == | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.ComponentModel; | |||
using System.Deployment.Application; | |||
using System.Threading.Tasks; | |||
using System.Windows.Forms; | |||
public class ApplicationUpdater | |||
{ | |||
// アップデートの進捗状況を通知するためのイベント | |||
public event EventHandler<ProgressChangedEventArgs> UpdateProgressChanged; | |||
public event EventHandler<AsyncCompletedEventArgs> UpdateCompleted; | |||
/// <summary> | |||
/// アプリケーションの更新を非同期で確認し、必要に応じて更新を実行します | |||
/// </summary> | |||
/// <returns>更新が実行されたかどうかを示すブール値</returns> | |||
public async Task<bool> CheckAndUpdateAsync() | |||
{ | |||
try | |||
{ | |||
// ClickOnceでデプロイされているかを確認 | |||
if (!ApplicationDeployment.IsNetworkDeployed) | |||
{ | |||
throw new InvalidOperationException("このアプリケーションはClickOnceでデプロイされていません。"); | |||
} | |||
var deployment = ApplicationDeployment.CurrentDeployment; | |||
// 更新の確認を非同期で実行 | |||
var updateCheckInfo = await Task.Run(() => deployment.CheckForDetailedUpdate()); | |||
if (!updateCheckInfo.UpdateAvailable) | |||
{ | |||
return false; // 更新は不要 | |||
} | |||
// 更新のダウンロードと適用を非同期で実行 | |||
await UpdateApplicationAsync(deployment); | |||
return true; | |||
} | |||
catch (DeploymentDownloadException ex) | |||
{ | |||
throw new ApplicationException("アップデートのダウンロード中にエラーが発生しました。", ex); | |||
} | |||
catch (InvalidDeploymentException ex) | |||
{ | |||
throw new ApplicationException("ClickOnceの展開に問題が発生しました。", ex); | |||
} | |||
catch (Exception ex) | |||
{ | |||
throw new ApplicationException("アップデートプロセス中に予期せぬエラーが発生しました。", ex); | |||
} | |||
} | |||
/// <summary> | |||
/// アプリケーションの更新を非同期で実行し、進捗状況を通知します | |||
/// </summary> | |||
/// <param name="deployment">ApplicationDeploymentのインスタンス</param> | |||
private async Task UpdateApplicationAsync(ApplicationDeployment deployment) | |||
{ | |||
try | |||
{ | |||
// 進捗状況の通知を設定 | |||
deployment.UpdateProgressChanged += (sender, args) => { | |||
UpdateProgressChanged?.Invoke(this, new ProgressChangedEventArgs(args.ProgressPercentage, $"ダウンロード進捗: {args.BytesCompleted}/{args.BytesTotal} バイト")); | |||
}; | |||
deployment.UpdateCompleted += (sender, args) => { | |||
UpdateCompleted?.Invoke(this, args); | |||
}; | |||
// 更新の適用を非同期で実行 | |||
await Task.Run(() => deployment.Update()); | |||
// アプリケーションの再起動が必要な場合の処理 | |||
if (MessageBox.Show("アップデートが完了しました。アプリケーションを再起動しますか?", "更新完了", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) | |||
{ | |||
Application.Restart(); | |||
} | |||
} | |||
catch (Exception ex) | |||
{ | |||
throw new ApplicationException("更新の適用中にエラーが発生しました。", ex); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
// 使用例 | |||
public class Program | |||
{ | |||
public static async Task Main() | |||
{ | |||
var updater = new ApplicationUpdater(); | |||
// 進捗状況の表示を設定 | |||
updater.UpdateProgressChanged += (sender, args) => { | |||
Console.WriteLine($"進捗状況: {args.ProgressPercentage}% - {args.UserState}"); | |||
}; | |||
try | |||
{ | |||
bool updatePerformed = await updater.CheckAndUpdateAsync(); | |||
if (!updatePerformed) | |||
{ | |||
Console.WriteLine("利用可能な更新はありません。"); | |||
} | |||
} | |||
catch (ApplicationException ex) | |||
{ | |||
MessageBox.Show($"更新プロセスでエラーが発生しました: {ex.Message}", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||