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]当那行代码运行时,你会看到它从“English”变为“Russian”。

以下代码(在控制台应用程序中使用)将保留更改。

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

上面要注意的一点是,如果您从调试器(在 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 回答
12

当使用“ ConfigurationUserLevel.None ”时,当您单击调试文件夹中的 nameyourapp.exe 时,您的代码会正确运行。.
但是当你在视觉标准输出上开发应用程序时运行不正确!因为“vshost.exe”正在运行。

以下参数解决了这个问题:“ Application.ExecutablePath

试试这个:(在 VS 2012 Express For Desktop 中测试)

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["PortName"].Value = "com3";
config.Save(ConfigurationSaveMode.Minimal);

我的英语不好,对不起。

于 2015-02-12T03:06:02.057 回答
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
    private static string GetSetting(string key)
    {
        return ConfigurationManager.AppSettings[key];
    }

    private static void SetSetting(string key, string value)
    {
        Configuration configuration =
            ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        configuration.AppSettings.Settings[key].Value = value;
        configuration.Save(ConfigurationSaveMode.Full, true);
        ConfigurationManager.RefreshSection("appSettings");
    }
于 2014-09-12T10:57:02.263 回答
3

除了 fenix2222 的答案(对我有用)之外,我还必须将最后一行修改为:

config.Save(ConfigurationSaveMode.Modified);

没有这个,新值仍被写入配置文件,但在调试时会检索旧值。

于 2015-09-18T10:38:47.987 回答
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

感谢 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

要更新 以外的条目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 回答