【问题标题】:ConfigurationManager doesn't save settingsConfigurationManager 不保存设置
【发布时间】:2011-05-12 03:15:34
【问题描述】:

这是我正在使用的代码:

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 文件中键入的值。有什么建议吗?

【问题讨论】:

  • 您可能应该考虑使用 string.IsNullOrEmpty(...) 而不是与 "" 进行比较 :)

标签: c# app-config


【解决方案1】:

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

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

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

如果您正在调试一个寻找设置的程序,如果不存在,则编写它,这会非常令人困惑。即使预先警告您不要期望该设置在您第二次运行该程序时就在那里,人们也可能期望它在该程序第一次运行之后和第二次运行之前就在那里......唉!

没有什么可担心的,因为正如其他人已经说过的那样,当应用程序部署或直接从 bin 启动时,这一切都可以工作......

但是,如果您正在调试程序并决定第一次使用应用程序设置,并且为了避免手写 XML 您决定从代码开始并获得编写设置的程序...获取所有这些内容,然后可能会添加更多内容。

【讨论】:

    【解决方案2】:

    我认为你应该调用 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 Class

    【讨论】:

    • 没有 .Save() 方法。
    • 为了让这个工作我不得不使用这个 config.AppSettings.Settings["Username"].Value = txtUsername.Text; config.AppSettings.Settings["密码"].Value = txtPassword.Text;
    • 你的最后一行代码不正确。它应该是 ConfigurationManager.RefreshSection()。配置类没有 RefreshSection 方法。
    • 我现在没有 Visual Studio 来检查代码,而且我有一段时间没有使用这个类,所以我可能错了。我以为我从工作源复制/粘贴它们,但是当我发布编辑时我可能犯了一些错误。你确定你在正确的框架版本上测试过它吗?如果你确定我可以编辑它
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,很好的解释。
    • 如果你在调试模式下运行,它将是 yourexecutable.vshost.exe.config
    • 很好的解释!从昨天开始,我一直想知道为什么直到我读到这个配置才保存在原始的 App.config 文件中。谢谢!
    • 您最好使用自己的文件,然后您可以完全控制它。必须在这里提出一个问题的事实突出了内置设置文件设计不佳。另一个问题是名称与带有配置扩展名的 exe 相同。 Windows 不显示文件扩展名的恼人默认设置意味着您的配置文件显示在客户站点上,看起来像一个 exe 文件。
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2013-01-09
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多