トップ回答者
同アプリの旧バージョンから新バージョンにapp.configの情報を移行させたい

質問
-
いつも利用させてもらっています。
C#に限った話ではありませんがapp.configについて教えて欲しいことがあり投稿しました。.net framework4のWinformsアプリ(C#)を開発・配布しております。
そのアプリはオプション画面から設定できる各種設定内容やウィンドウのサイズなどのユーザー固有の情報をapp.config内に更新・保存するようにしております。配布はClickOnceなど使用せず、ユーザーが所定のWebページから新バージョンをダウンロード&解凍してローカルの好きな場所にコピーしてもらうという方法になっています。
インストール作業などはありません。このアプリではバージョンを設定しております。
例えばバージョン1.0.0.0で使用されていたapp.configは、新バージョンとして配布された1.1.0.0からは参照されることがありません。
そのため新バージョンを配布するたびにユーザーが再度各種設定を再登録する必要があります。このユーザーのコストを削減したいと思っております。
例えば、前バージョンの実行ファイルを選択するとそのバージョンのapp.config内の値を読み取り現バージョンのapp.config内の各項目に上書きするといったような機能をアプリに追加できたらと思っています。そもそもそういったことが可能なのか、またバージョンアップにともなうapp.configの移行方法で良く取られる手法などがあればご指導ください。
よろしくお願いします。
回答
-
app.config内のユーザー設定部分(UserScopedSettingAttributeが付加されている項目)の引継ぎは、ApplicatoinSettingBase.Upgradeでできますよ。初期状態ならProperties.Settings.Default.Upgrade();を呼ぶだけですよ。
#設定保存フォルダ決定のハッシュ値が変化する変更をしているなどは対応できない場合があります。バージョン番号が現在実行中のバージョン以前で一番新しいバージョンの設定の引継ぎのみとか制限はあります。
任意のバージョンから引き継ぎたければIApplicationSettingsProviderを自前で実装する必要があるでしょう。#「ApplicationSettingsBase.Upgrade メソッドを呼ぶ判断をするには」も参考にどうぞ
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク ダメンジニア 2012年7月12日 13:54
すべての返信
-
app.config内のユーザー設定部分(UserScopedSettingAttributeが付加されている項目)の引継ぎは、ApplicatoinSettingBase.Upgradeでできますよ。初期状態ならProperties.Settings.Default.Upgrade();を呼ぶだけですよ。
#設定保存フォルダ決定のハッシュ値が変化する変更をしているなどは対応できない場合があります。バージョン番号が現在実行中のバージョン以前で一番新しいバージョンの設定の引継ぎのみとか制限はあります。
任意のバージョンから引き継ぎたければIApplicationSettingsProviderを自前で実装する必要があるでしょう。#「ApplicationSettingsBase.Upgrade メソッドを呼ぶ判断をするには」も参考にどうぞ
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク ダメンジニア 2012年7月12日 13:54
-
gekka様
情報をありがとうございました。
Upgradeメソッドというのがあったのですね。
勉強になりました。
ただ、今回はバージョンアップ時に設定保存フォルダのハッシュ値に変更が発生してしまいます。
インストーラーなどを用意していないため前バージョンと同じフォルダ内に配置されるとは限らないのです。
アドバイスいただいたIApplicationSettingsProviderの実装でこれも対応できるのかもしれませんが、今回は設定情報を独自フォーマットでエクスポート&インポートできる機能を追加する方向で対応することにしました。
もし設定保存フォルダのハッシュ値に変更など発生しないのであれば、user.config内にフラグ(初期値True)を持たせSettings.csのコンストラクタ内でフラグの値がTrueであればUpgradeメソッドの実行しフラグをFalseにしてSaveメソッド実行と言った形でいけますね。
どうもありがとうございました。