配置管理器未保存设置。

23

这是我正在使用的代码:

private void SaveConfiguration()
{
    if (txtUsername.Text != "" && txtPassword.Text != "")
    {
        ConfigurationManager.AppSettings["Username"] = txtUsername.Text;
        ConfigurationManager.AppSettings["Password"] = txtPassword.Text;

        MessageBox.Show("Su configuracion guardo exitosamente.", "Exito!");
        this.Close();
    }
    else
    {
        MessageBox.Show("Por favor lleno los campos.", "Error.");
    }
}

现在,设置已经被持久化,但是当我关闭应用程序并按F5重新运行它时,值会恢复到输入到 app.config 文件中的内容。有什么建议吗?


3
你可能应该考虑使用string.IsNullOrEmpty(...)而不是与“”进行比较 :) - Muad'Dib
3个回答

61

我认为你应该调用Save方法

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

编辑

为了能够保存,您需要使用由OpenExeConfiguration方法返回的配置对象。

//Create the object
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

//make changes
config.AppSettings.Settings["Username"].Value = txtUsername.Text;
config.AppSettings.Settings["Password"].Value = txtPassword.Text;

//save to apply changes
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

这里有更多相关资料 ConfigurationManager类


11
没有 .Save() 方法。 - delete
2
为了让这个工作起来,我不得不使用以下代码: config.AppSettings.Settings["Username"].Value = txtUsername.Text; config.AppSettings.Settings["Password"].Value = txtPassword.Text; - Martin
1
你的最后一行代码是错误的。应该是 ConfigurationManager.RefreshSection()。 Configuration 类没有 RefreshSection 方法。 - Kornelije Petak
2
我现在没有Visual Studio来检查代码,而且已经有一段时间没有使用这个类了,所以我可能会错。我认为我是从一个工作的源代码中复制/粘贴它们的,但当我发布编辑时可能犯了一些错误。你确定你在正确的框架版本上测试过它吗?如果你确定了,我可以进行编辑。 - il_guru

35

当你使用F5运行你的应用程序时,

  • 你的代码被编译,
  • 可执行文件被复制到源代码目录下的binbin\Debug子目录中,
  • 你的app.config会被复制为yourexecutable.exe.config放置在该目录下,并且
  • 你的可执行文件将在该目录中启动。

因此,你的应用程序使用的是binbin\Debug目录下的yourexecutable.exe.config,而ConfigurationManager在那里保存更改,而不是在你的源代码目录中保存。这在部署应用程序后不会成为问题,因为此时更改将会保存在部署目录中的yourexecutable.exe.config中,这正是你想要的。


2
如果你在调试模式下运行,它将是你的可执行文件.vshost.exe.config。 - Appetere
很好的解释!自从昨天我一直在想为什么配置没有保存在原始的App.config文件中,直到我读到这篇文章。谢谢! - Rizki Pratama
你最好使用自己的文件,这样你就可以完全控制它。必须在这里提出问题的事实凸显了内置设置文件设计得很差。另一个问题是名称与带有配置扩展名的exe相同。Windows 的烦人默认设置不显示文件扩展名,这意味着你的配置文件在客户站点上看起来像一个exe文件。 - Paul McCarthy

0

关于Appetere在第二个答案中的评论:

还要注意的是,如果您正在调试(并且未禁用vshost进程),那么当您的应用程序停止时,yourexecutable.vshost.exe.config将再次被替换为yourexecutable.exe.config。

因此,再次强调,您可能看不到之后所做的任何更改!(如果您在调试时停在断点处,在进行修改并调用刷新部分后查看文件,您将看到您的更改)。

如果您正在调试一个程序,并且该程序正在寻找某个设置,如果没有找到,则会写入该设置,这就非常令人困惑。即使您已经预先警告不要期望第二次运行程序时该设置存在,但您可能会期望在第一次运行程序之后和第二次运行程序之前存在该设置...唉!

这并不是什么大问题,因为当应用程序部署或直接从bin启动时,所有这些都可以正常工作,正如其他人已经说明的那样...

但是,如果您正在调试程序并决定首次使用应用程序设置,并且为了避免手写XML,您决定从代码开始编写并让程序编写设置...然后添加更多内容,那么就有可能陷入“陷阱”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接