1

它适用于Read,但我似乎无法做到这Write一点。当我尝试写入文件时,它不会抛出任何 IO 异常。好像什么都没发生一样。

这是我的代码,请看GetValue()SetValue()功能:

using System.Configuration;

public class AppConfig {
    private string _username;
    private string _password; 

    public AppConfig() {
        _filePath = GetValue("Username");
        _password = GetValue("Password");
        //... more
    }
    public string Password {
        get { return _password; }
        set { SetValue("Password", value); _password = value; }
    }
    public string Username {
        get { return _username; }
        set { SetValue("Username", value); _username = value; }
    }
    private void SetValue(string key, string val) {
        var cfg= ConfigurationManager
                .OpenExeConfiguration(ConfigurationUserLevel.None);
        cfg.AppSettings.Settings[key].Value = val;
        cfg.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");
    }
    private string GetValue(string key) {
        return ConfigurationManager.AppSettings[key];
    }
}

这是 app.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>

    <add key ="Password" value ="123456"/>
    <add key ="Username" value ="hohoho"/>

  </appSettings>
</configuration>

知道如何使Write事情发生吗?谢谢你。

4

2 回答 2

2

.Net 中的配置系统并非旨在让您以编程方式将更改保存到程序集文件夹中的 app.config。我知道那里有一个“保存”方法,但这些更改实际上保存到配置文件的副本中。副本的位置取决于设置的范围。

应用程序设置,例如:

<appSettings>
     <add key="" value=""/>
</appSettings>

如果我没记错的话,有“应用范围”。如果您使用项目设置页面中的设置页面或Settings.settings在属性文件夹中打开,您可以选择范围(用户或应用程序)。

这样,对当前用户或特定版本的应用程序的设置更改将保持不变。这些副本存储在相应帐户的 %APPDATA% 中某处的生成文件夹中。配置系统会根据登录者自动重新加载设置。

这就是为什么您也有“升级”方法的原因。它允许您将设置添加到应用程序的新版本并升级用户的设置,从而仅将新属性添加到用户的副本中。这样,程序集文件夹中的app.config中的设置只是设置的默认值。

上面的评论触及了为什么它是这样工作的:Program Files 中的文件在安装后保持不变,UAC 确保了这一点。

我建议阅读配置系统,它非常强大。如果还是真的要修改app.config,就得写自定义代码直接修改app.config文件

  • 安装到用户的个人资料文件夹中,或
  • 始终以管理员身份运行您的程序
于 2012-12-20T08:46:29.203 回答
0

试试下面的代码

 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        config.AppSettings.Settings[key].Value = value;
        config.Save();
        ConfigurationManager.RefreshSection("appSettings");
于 2016-03-04T21:31:43.697 回答