4

ユーザーレベルの設定にカスタム構成セクションを使用するアプリケーションがあります。設定ファイルのデフォルトのようにプロジェクトごとに設定するのではなく、プログラムの単一の app.config に設定を一元化できるように、設定ファイルを使用する代わりにこの方法で行われます。

問題は、これらのカスタム設定がユーザーごとに構成可能であり、ユーザーがソフトウェアをアップグレードすると失われることです (新しいビルド バージョン用の新しいフォルダーが作成され、古いフォルダーは使用されなくなります)。したがって、更新時、またはアップグレード後のユーザーごとのアプリケーションの最初の実行時に、これらの設定を移行する方法が必要です。Settings.Upgrade()に関する情報を見てきました、ただし、構成の設定ファイルセクションでのみ機能します。ConfigurationSection (カスタム設定クラス/セクションの派生元) のドキュメントを調べましたが、役立つものはないようです。OpenExeConfiguration のオーバーロードは実行可能ファイルとユーザー レベルの両方の指定をサポートしていないため、ConfigurationManager を使用してインストーラーからユーザー設定を取得して移行することは行き止まりのようです。

ヒントはありますか?保存されている情報は重要ではありませんが (ほとんどの場合、ウィンドウのジオメトリとレイアウトの設定が記憶されています)、アプリがアップグレードされるたびに失われるのは煩わしい場合があります。私が考えることができる唯一のことは、これらの設定の構成メカニズムを完全に放棄し、これらの設定をユーザーの AppData (他のいくつかのユーザー固有のファイルを保存する場所) のバージョンに依存しないファイルに保存するための独自のモデルを実装することです。app.config ラッパーを放棄することで多くを失うため、これを最後の選択肢にしたいと思います。

4

2 に答える 2

1

更新中にそのままの状態を維持する外部構成セクションファイルへの参照を作成することをお勧めします。configSource属性を使用して、ファイルを参照します。

これにより、ユーザーはapp.configが更新されたときに設定を保持できます。

これは関連する投稿です:.NETのカスタム構成セクションのconfigSource属性を有効にする方法は?

于 2011-05-30T10:16:10.400 に答える
0

これは古い質問ですが、Google経由で誰かがここにたどり着いた場合に備えて、回答を書きます。

以前のバージョンのファイル パスを強制的に記憶し、新しい構成の場所にあるファイルを古いファイルで上書きすることで、この問題を「解決」しました。

このアプローチには多くの欠陥があると確信していますが、うまくいくかもしれない簡単な解決策を探しているなら、これが役立つかもしれません.

if (Settings.Default.IsNewVersion)
{
    Settings.Default.Upgrade();
    var targetConfigPath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;

    if (!string.IsNullOrWhiteSpace(Settings.Default.ConfigPath))
    {
        System.IO.File.Copy(Settings.Default.ConfigPath, targetConfigPath, true);
        Settings.Default.Reload();
    }

    Settings.Default.ConfigPath = targetConfigPath;
    Settings.Default.IsNewVersion = false;

    Settings.Default.Save();
}
于 2014-01-14T15:24:59.477 に答える