概要
何も気にしないでClickOnceのアプリケーションを発行した場合、
バージョンアップすると設定が消えてしまいます。
その対策です。
アプリケーション設定を使う
- プロジェクトのプロパティの「設定」を開きます。
下記の図のように、
- 名前:IsUpgraded、種類:bool型、スコープ:ユーザー、値:False
- 任意の設定、スコープ:ユーザー
を作成します。
スコープを「アプリケーション」にすると、バージョンアップ時に上書きされるため使用しません。
- 下記コードのように、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.0.0.0のアプリを起動して、アプリケーション設定を変更する。
- ClickOnceでアセンブリバージョン1.0.0.1にバージョンアップする。
- アセンブリバージョン1.0.0.1のアプリを起動する。
Upgrade()が実行されることで「1」の変更が反映される。
ここでは問題ない。 - アセンブリバージョン1.0.0.1のアプリ上で、アプリケーション設定を変更して終了する。
- 再度、アセンブリバージョン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
-
http://d.hatena.ne.jp/among_ev/20110219/1298120888
- アプリケーション設定を使う方法