44

これは私のApp.Configです

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="lang" value="English"/>
  </appSettings>
</configuration>

このコードで私は変更を加えます

lang = "Russian";
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
     System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);
}

でも変わらない。私が間違っていることは何ですか?

4

9 に答える 9

96

AppSettings.Set構成ファイルへの変更は保持されません。メモリ内で変更するだけです。にブレークポイントを設定しSystem.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);、 のウォッチを追加すると、System.Configuration.ConfigurationManager.AppSettings[0]そのコード行が実行されると、「英語」から「ロシア語」に変わることがわかります。

次のコード (コンソール アプリケーションで使用) は、変更を保持します。

class Program
{
    static void Main(string[] args)
    {
        UpdateSetting("lang", "Russian");
    }

    private static void UpdateSetting(string key, string value)
    {
        Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        configuration.AppSettings.Settings[key].Value = value;
        configuration.Save();

        ConfigurationManager.RefreshSection("appSettings");
    }
}

この投稿から: http://vbcity.com/forums/t/152772.aspx

上記の注意点の 1 つは、デバッガーから (Visual Studio 内で) これを実行している場合、ビルドするたびに app.config ファイルが上書きされることです。これをテストする最善の方法は、アプリケーションをビルドしてから出力ディレクトリに移動し、そこから実行可能ファイルを起動することです。出力ディレクトリ内には、構成ファイルである YourApplicationName.exe.config という名前のファイルもあります。これをメモ帳で開いて、変更が実際に保存されていることを確認します。

于 2012-06-22T02:49:28.430 に答える
52

これには AppSettings 静的オブジェクトを使用できません。これを試して

string appPath = System.IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location);          
string configFile = System.IO.Path.Combine(appPath, "App.config");
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();         
configFileMap.ExeConfigFilename = configFile;          
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

config.AppSettings.Settings["YourThing"].Value = "New Value"; 
config.Save(); 
于 2012-06-22T02:46:33.160 に答える
7

それはWPFアプリケーションで私のために働いた:

string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();
于 2016-01-27T11:34:40.027 に答える
3

fenix2222 による回答 (私にとってはうまくいきました) に加えて、最後の行を次のように変更する必要がありました。

config.Save(ConfigurationSaveMode.Modified);

これがないと、新しい値は引き続き構成ファイルに書き込まれますが、デバッグ時に古い値が取得されました。

于 2015-09-18T10:38:47.987 に答える
2

答えてくれてありがとうJahmic。私にとっては適切に機能しました。

値を読み取って文字列を返す別の便利なコード スニペット:

public static string ReadSetting(string key)
    {
        System.Configuration.Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        System.Configuration.AppSettingsSection appSettings = (System.Configuration.AppSettingsSection)cfg.GetSection("appSettings");
        return appSettings.Settings[key].Value;

    }
于 2016-06-20T23:12:06.330 に答える
2

.NET 4.0 コンソール アプリケーションの場合、これらのどれもうまくいきませんでした。そこで、Kevn Aenmey の回答を以下のように変更したところ、うまくいきました。

private static void UpdateSetting(string key, string value)
{
    Configuration configuration = ConfigurationManager.
        OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
    configuration.AppSettings.Settings[key].Value = value;
    configuration.Save();

    ConfigurationManager.RefreshSection("appSettings");
}

最初の行だけが異なり、実際の実行中のアセンブリに基づいて構築されます。

于 2015-07-28T11:24:08.213 に答える
2

以外のエントリを更新するにはappsettings、単純に を使用しますXmlDocument

public static void UpdateAppConfig(string tagName, string attributeName, string value)
{
    var doc = new XmlDocument();
    doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    var tags = doc.GetElementsByTagName(tagName);
    foreach (XmlNode item in tags)
    {
        var attribute = item.Attributes[attributeName];
        if (!ReferenceEquals(null, attribute))
            attribute.Value = value;
    }
    doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
}

これはあなたがそれを呼び出す方法です:

Utility.UpdateAppConfig("endpoint", "address", "http://localhost:19092/NotificationSvc/Notification.svc");

Utility.UpdateAppConfig("network", "host", "abc.com.au");

このメソッドは、appSettings 値にも対応するように改善できます。

于 2019-04-18T01:39:55.000 に答える