c#forms - 以编程方式在.config文件中添加缺少的条目

时间:2011-10-04 14:08:04

标签: c# forms settings app-config

一个问题我谷歌搜索了很长时间后没有找到答案(然后长时间休息并再次搜索)......

说,我的应用程序设置中有2个设置。 String1和String2。更进一步说,我们发布了产品并开始添加次要功能(需要配置更多内容),我们添加了一个String3。 如果不手动遍历.config文件,我可以添加缺少的条目吗?当作为更新发布时(没有OneClick btw。),现有的.config文件只有String1和String2。

虽然默认为String3,但应用程序以某种方式理解缺少一个条目,因此应该可以,或者我认为,应该使用默认值添加这一个设置,以便其他程序或用户不会不必手动输入整个标签,而不知道它到底是什么名字。

提前致谢!

Qudeid

2 个答案:

答案 0 :(得分:3)

嗨大家好,

我刚刚发布了以下适用于我的代码。

只是解释一下: 我首先使用ConfigurationManager打开配置文件,获取相应的部分并将ForceSave设置为true,以便该部分确保保存。 然后,“魔术”开始了。我遍历程序集设置的所有属性,让linq发现它的魔力来查找元素是否存在。如果没有,我创建它并将其附加到文件。

注意:这段代码仅适用于应用程序设置,而不适用于用户设置,因为这是一个不同的部分。我没有尝试/测试它,但它可以像改变这一行一样简单:

ConfigurationSectionGroup sectionGroup = configFile.SectionGroups["applicationSettings"];

到这一行:

ConfigurationSectionGroup sectionGroup = configFile.SectionGroups["userSettings"];

因为这是该部分的相应名称。但不保证。

这是我的代码:

/// <summary>
/// Loads own config file and compares its content to the settings, and adds missing entries with 
/// their default value to the file and saves it.
/// </summary>
private void UpdateSettings()
{
  // Load .config file
  Configuration configFile = ConfigurationManager.OpenExeConfiguration(typeof(Settings).Assembly.Location);

  // Get the wanted section
  ConfigurationSectionGroup sectionGroup = configFile.SectionGroups["applicationSettings"];
  ClientSettingsSection clientSettings = (ClientSettingsSection)sectionGroup.Sections[0];

  // Make sure the section really is saved later on
  clientSettings.SectionInformation.ForceSave = true;

  // Iterate through all properties
  foreach (SettingsProperty property in Settings.Default.Properties)
  {
    // if any element in Settings equals the property's name we know that it exists in the file
    bool exists = clientSettings.Settings.Cast<SettingElement>().Any(element => element.Name == property.Name);

    // Create the SettingElement with the default value if the element happens to be not there.
    if (!exists)
    {
      var element = new SettingElement(property.Name, property.SerializeAs);
      var xElement = new XElement(XName.Get("value"));
      XmlDocument doc = new XmlDocument();
      XmlElement valueXml = doc.ReadNode(xElement.CreateReader()) as XmlElement;
      valueXml.InnerText = property.DefaultValue.ToString();
      element.Value.ValueXml = valueXml;

      clientSettings.Settings.Add(element);
    }
  }

  // Save config
  configFile.Save();
}

答案 1 :(得分:0)

在Visual Studio中创建设置(项目 - &gt;属性 - &gt; Settings.settings)时,您可以在设置编辑器中为该设置指定值。从设置定义(实际上是一个XML文件)生成一个代码文件,其中包含一个允许您访问设置的类。此类将默认使用分配给设置编辑器中的设置的值。但是,访问该设置时,它将在App.config文件中查找该设置的值。如果有值,它将覆盖代码生成文件中的默认值。

这意味着如果您向项目添加设置但未在App.config文件中为该设置提供值,则该设置的值将是设置编辑器中指定的默认值。

要覆盖该值,请在应用程序的App.config文件中指定它。

由于您的应用程序可以拆分为多个项目创建的多个程序集,因此无法自动执行在从属程序集中添加设置为该项目创建主项目的App.config文件的条目的过程。你必须自己做,我害怕。

但这正是系统之美:两个.exe项目可以依赖于定义设置的同一个.dll项目。在每个.exe项目中,您可以覆盖.exe项目的App.config文件中的设置,或者您可以决定使用.dll项目定义的默认值。