16

アプリケーション設定を使用して実行時に書き込むことができるアプリケーションまたはマシンレベルの設定を保存する方法を探しています。ユーザー設定では読み取り/書き込みが許可されていますが、アプリケーション設定では許可されていません。私は実行時にこのような設定を保存するためにユーザー設定を使用してきましたが、これは次の理由で実際には実用的でないことが証明されています。

  • マシンのすべてのユーザーは設定を共有する必要があります。
  • サポートコール(特に危機的状況)では、これらの設定を手動で見つけて変更する場所をユーザー/従業員に説明することは困難です(appdataはとりわけ隠しフォルダーです)。
  • アプリの新しいバージョンでは、以前の設定を使用する必要があります(ユーザー設定は新しいバージョンで吹き飛ばされるようです)。
  • 従業員がアプリケーションを新しいフォルダにコピーすると、ユーザー設定もリセットされるのが一般的です。

いずれにせよ、当社のマシンは1人のユーザーのみが使用するため、ユーザー固有の設定は通常必要ありません。

それ以外の場合は、アプリケーション設定を使用するのが本当に好きで、可能であれば引き続き使用したいと思います。設定がEXEと同じフォルダにあることができれば理想的です(かつての古き良きiniファイルのように)。

注:これはWPFアプリケーションであり、ASP.net Webアプリではないため、web.configはありません。

4

3 に答える 3

9

さて、私はまだ実行時にアプリケーション設定を変更したくありませんでした(それは私がユーザー設定を使用するためのものです)が、私ができることはインストール時にアプリケーション設定を書くことです。同様のアプローチが実行時に機能する可能性があると思います。他に提案されたソリューションATMがないように思われるので、試してみることができます。

    exePath = Path.Combine( exePath, "MyApp.exe" );
    Configuration config = ConfigurationManager.OpenExeConfiguration( exePath );
    var setting = config.AppSettings.Settings[SettingKey];
    if (setting != null)
    {
        setting.Value = newValue;
    }
    else
    {
        config.AppSettings.Settings.Add( SettingKey, newValue);
    }

    config.Save();

お役に立てば幸いです。

于 2010-09-09T17:22:33.127 に答える
7

<AppSettings>これは、 :のエントリを変更できるようにする方法です。

    internal static bool SetSetting(string Key, string Value)
    {
        bool result = false;
        try
        {
            System.Configuration.Configuration config =
              ConfigurationManager.OpenExeConfiguration(
                                   ConfigurationUserLevel.None);

            config.AppSettings.Settings.Remove(Key); 
            var kvElem= new KeyValueConfigurationElement(Key, Value);
            config.AppSettings.Settings.Add(kvElem);

            // Save the configuration file.
            config.Save(ConfigurationSaveMode.Modified);

            // Force a reload of a changed section.
            ConfigurationManager.RefreshSection("appSettings");                

            result = true;
        }
        finally
        { }
        return result;
    } // function

更新後にセクションを更新する必要があることがわかりましたappSettings

この関数は、キーを追加する前にキーを削除して、二重入力を回避します。これは、キーが以前に存在しなかった場合にも機能します。エラーがある場合はfalseを返し、成功するとtrueを返します。設定を読み取る方法は簡単で、完全を期すためにリストされています。

    internal static string GetSetting(string Key)
    {
        string result = null;
        try
        {
            result = ConfigurationManager.AppSettings[Key];
        }
        finally
        { }
        return result;
    } // function

エラーを抑制するために、 try...finallyブロックで囲んでいることに注意してください。エラーが発生した場合、GetSettingは単にnullを返し、SetSettingはfalseを返します。これにより処理が簡単になりますが、例外が必要な場合でも追加できます

        catch (Exception) { throw; }

呼び出し元に例外をスローします。または、デバッグ用に次を追加できます。

        #if DEBUG
        catch (Exception ex) { 
                System.Diagnostics.Debug.WriteLine(ex.ToString()); 
        }
        #endif

「デバッグ」構成を選択した場合、Visual Studioの[出力]ウィンドウに例外が表示されますが、コードは続行されます。


注(同様のトピックへの相互参照):

  • applicationSettingsセクションは、「User」スコープと「Application」スコープを区別し、文字列だけでなくさまざまなデータ型をサポートするため、異なります。applicationSettingsを処理する方法を知りたい場合は、ここ(stackoverflow)で見つけることができます:applicationSettings
    にアクセスする方法

  • AppSettings使用するかどうかわからない場合は、決定する前にこれapplicationSettings読んでください。

  • 警告が発生した場合は'ConfigurationSettings.AppSettings' is obsoleteこのヒントが役立ちます。

  • .NET Coreフレームワークを使用している場合は、次のリンクを確認してください:.NETCoreのAppSettings

于 2012-08-07T07:27:57.627 に答える
3

WPFアプリケーションは、WinFormsアプリと同じようにapp.configファイルにアクセスできます。

ConfigurationManager.OpenExeConfiguration()

方法。秘訣は、アクセスする値をApp.configファイル(WPFアプリケーションでも使用可能)のAppSettingsタグに含めることです。

これらすべての秘訣は、プロパティの変更が完了したら、必ず次のメソッドを呼び出すことです。

MyConfig.Save(ConfigurationSaveMode.Modified)
ConfigurationManager.RefreshSection("appSettings")

少し前に、これについて完全な「ハウツー」を書きました。これは、ここですべてを説明しています。

于 2010-09-09T17:30:35.570 に答える