ConfigurationManager不保存设置

这是我正在使用的代码:

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."); } } 

现在,这些设置是持久的,但是当我closures应用程序并按F5再次运行时,这些值将被还原为input到app.config文件中的内容。 有什么build议么?

我想你应该调用Save方法

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

编辑

为了能够保存你必须使用由OpenExeConfiguration方法返回的configuration对象

 //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类

当您使用F5运行应用程序时,

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

因此,您的应用程序使用binbin\Debug目录中的yourexecutable.exe.configConfigurationManager保存更改,而不是在源代码目录中。 在部署应用程序之后,这不会是一个问题,因为这样,更改将转到部署目录中的yourexecutable.exe.config ,这正是您想要的。

除了Appetere对第二个答案的评论:

另外请注意,如果您正在debugging(并且未禁用vshost进程),那么当您的应用程序停止时,yourexecutable.vshost.exe.config将再次被yourexecutable.exe.configreplace。

所以再一次,你可能看不到你之后做出的任何改变! (如果您在debugging时停止了断点,并在修改并调用刷新部分后查看文件,则会看到您的更改)。

如果您正在debugging查找设置的程序,并且如果不存在,则会写入该程序,这非常令人困惑。 即使你预先警告你不要期望第二次运行这个程序的时候,你也可以期待它在程序的第一次运行之后,在第二次运行之前就在那里了…唉!

没有什么可担心的,因为当应用程序被部署或直接从bin启动时,正如其他人已经声明的那样,

但是,如果您正在debugging程序并决定首次使用应用程序设置,并且避免手写XML,那么您可能会陷入“陷阱”中,您决定从代码开始,然后将程序写一个设置…得到所有的东西,然后可能再添加几个。