4
4

More than 5 years have passed since last update.

ClickOnceでバージョンアップしても消えないデータの残し方

Last updated at Posted at 2018-05-10

概要

何も気にしないでClickOnceのアプリケーションを発行した場合、
バージョンアップすると設定が消えてしまいます。
その対策です。

アプリケーション設定を使う

  1. プロジェクトのプロパティの「設定」を開きます。
    下記の図のように、
    - 名前:IsUpgraded、種類:bool型、スコープ:ユーザー、値:False
    - 任意の設定、スコープ:ユーザー
    を作成します。
    スコープを「アプリケーション」にすると、バージョンアップ時に上書きされるため使用しません。
    application_setting.png
  2. 下記コードのように、Upgrade()を実行する処理を追加します。
Program.cs
static void Main(string[] args)
{
    // 以下のコードを追加
    if (!Properties.Settings.Default.IsUpgraded)
    {
        Properties.Settings.Default.Upgrade();
        Properties.Settings.Default.IsUpgraded = true;
        Properties.Settings.Default.Save();
    }
}

Upgrade()を実行する処理の前に、IsUpgradedによる条件を追加しています。
これは、常にUpgrade()を実行すると、以下のパターンで問題が発生するためです。

  1. アセンブリバージョン1.0.0.0のアプリを起動して、アプリケーション設定を変更する。
  2. ClickOnceでアセンブリバージョン1.0.0.1にバージョンアップする。
  3. アセンブリバージョン1.0.0.1のアプリを起動する。
    Upgrade()が実行されることで「1」の変更が反映される。
    ここでは問題ない。
  4. アセンブリバージョン1.0.0.1のアプリ上で、アプリケーション設定を変更して終了する。
  5. 再度、アセンブリバージョン1.0.0.1のアプリを起動する。
    Upgrade()が実行されることで「1」の変更が反映される。
    それにより「4」の設定が戻ってしまう問題が発生する。

データディレクトリを使う

「データディレクトリ」と呼ばれるディレクトリのファイルは、バージョンアップしても保持されます。
そのため、このディレクトリに設定を保存します。
ただし、データディレクトリの取得は、直接exeを実行した場合は例外になるため条件を追加します。

Program.cs
// ClickOnceで配布されたアプリケーションを実行した場合は、
string dataDirectory;
if (ApplicationDeployment.IsNetworkDeployed)
{
    // データディレクトリに保存します (最後に'\'は含まないので注意)
    dataDirectory = ApplicationDeployment.CurrentDeployment.DataDirectory;
}
// 直接exeを実行した場合は、
else
{
    // exeと同じパスに保存します (最後に'\'を含む)
    dataDirectory = AppDomain.CurrentDomain.BaseDirectory;
}
// ディレクトリの最後の'\'の有無が異なるため、Path.Combineでつなげる
string dataPath = Path.Combine(dataDirectory, "data.ini");

// 出力
using (var writer = new StreamWriter(dataPath))
{     
    writer.WriteLine("data");
}

参考URL

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4