C#应用程序设置:如何更新app.config文件?

6

我正在使用.NET 4.0,希望使用app.config文件来存储一些参数设置。我的做法如下:使用项目属性中的Settings标签创建参数。

这会将信息添加到app.config文件中,如下所示:

<MyApp.Properties.Settings>
      <setting name="param1" serializeAs="String">
        <value>True</value>
      </setting>
<MyApp.Properties.Settings>

在我的视图模型(我的代码中),我可以通过以下方式访问此信息:

bool myBool = MyApp.Properties.Default.param1;

当我尝试更改配置文件中的值时,我会尝试以下操作:
Properties.Settings.Default.param1 = false;

但这会导致一个错误,即 param1 是只读的。
那么我该如何从我的代码中更新配置文件呢?

1
可以尝试这个:https://dev59.com/MXM_5IYBdhLWcg3wfTO7 - Hari Gillala
在这个解决方案中,他们使用了config.AppSettings。AppSettings已经被弃用了吗?我想使用ApplicationSettings,因为它使用了类型化参数。 - Álvaro García
我编辑了我的答案,通过EDIT2提供了一个链接,该链接指向一个包含可能是您解决方案的代码的答案 :) - il_guru
4个回答

11

这是我用来更新或添加“applicationSettings”部分的app.config条目的函数。可能有更好的方法,但这对我有效。如果有人能提出更好的方法,请分享一下,我们始终在寻找更好的解决方案。

    static string APPNODE = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Properties.Settings";
    static DateTime now = DateTime.Now;
    Utilities.UpdateConfig(APPNODE, "lastQueryTime", now.ToString());

    static public void UpdateConfig(string section, string key, string value)
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        ClientSettingsSection applicationSettingsSection = (ClientSettingsSection)config.SectionGroups["applicationSettings"].Sections[section];
        SettingElement element = applicationSettingsSection.Settings.Get(key);

        if (null != element)
        {
            applicationSettingsSection.Settings.Remove(element);
            element.Value.ValueXml.InnerXml = value;
            applicationSettingsSection.Settings.Add(element);
        }
        else
        {
            element = new SettingElement(key, SettingsSerializeAs.String);
            element.Value = new SettingValueElement();
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            element.Value.ValueXml = doc.CreateElement("value");

            element.Value.ValueXml.InnerXml = value;
            applicationSettingsSection.Settings.Add(element);
        }

        config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("applicationSettings");            
    }

5

我读了Hari Gillala的链接,其中一个用户建议直接编辑xml文件app.config。

因此在项目属性—>设置中,我创建需要的参数。然后,在代码中加载参数时,我执行以下操作:

_myViewModelProperty = MyApp.Properties.Settings.Default.MyParam1;

以这种方式,我可以轻松地阅读配置参数的信息。它是打字的,所以在设计时我可以看到分配是否正确。
要更新配置文件,我使用.NET的XML库编辑app.config文件。
    System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
    xml.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    System.Xml.XmlNode node;
    node = xml.SelectSingleNode("configuration/applicationSettings/MyApp.Properties.Settings/setting[@name='myparam1']");
    node.ChildNodes[0].InnerText = myNewValue;
    xml.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

我这样创建了一个xml文档(xml变量),加载app.config文件的信息。然后,我查找要更新的节点,更新其信息(InnerText属性),最后保存更改。

这样,我可以更新app.config。这正是我想要的,因为在便携应用程序中,只有一个用户会使用它,并且我希望配置适用于运行应用程序的任何计算机。


3
你应该使用 Properties.Settings 来执行此操作。 你可以查看这个文档获取更多信息。
//modify
Properties.Settings.Default.param1 = false;
//save the setting
Properties.Settings.Default.Save();

请注意,如果您的设置范围是用户级别(必须可写),则属性将保存在其他地方,而不是本地配置文件中。有关详细信息,请参见这里
编辑后的建议:我的建议是切换到AppSettings,因为经过一些搜索,我发现appsettings会更改应用程序数据文件夹中的.config文件(在我的计算机上运行一些测试可以证实这一点)。请参考此问题的答案中的评论。
我不确定是否有什么解决方法,但如果您希望应用程序具有便携式app.config文件,则唯一的方法是切换到AppSettings,我确信可以在程序文件夹中找到app.config中保存更改。
第二次编辑:可能的解决方案 我发现了一个可能的解决方案,可以使您的应用程序便携!您可以更改Settings使用的Provider来保存应用程序的设置,创建自定义Provider即可。 这个问题的答案提供了一个代码链接,可以使applicationsettings便携。我认为您可以尝试一下。

1
其实我是用这种方式 Properties.Settings.Default,但是我写错了代码。就是这种方式导致了错误的出现。 - Álvaro García
1
我尝试使用这种方式,但文件myApp.exe.config没有更新。但是当我重新启动我的应用程序时,更改生效了,因此我认为配置保存在其他地方,但在我的程序文件夹中没有其他文件。 - Álvaro García
1
我已经尝试过了,得到了相同的结果。我不确定它保存在哪里... 为什么不使用ConfigurationManager移动到AppSettings? - il_guru
如果我没记错的话,appSettings是旧版本,而applicationSettings是新版本。我知道如何使用appSettings,但我想使用ApplicationSettings。其中一个原因是在配置文件中允许使用类型化参数。 - Álvaro García
我修改了问题并添加了答案,因为在这里添加它太凌乱了。此外,applicationSettings也很老(“老”是指旧版本中存在),但我必须承认我不知道其中哪一个已被弃用。 - il_guru
显示剩余6条评论

2

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