以编程方式在.config文件中添加缺失的条目

本文关键字:添加 方式 编程 config 文件 | 更新日期: 2023-09-27 18:10:35

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

比如说,我在我的应用程序设置中有2个设置。String1和String2。进一步说,我们发布了产品,并开始添加次要特性(更多需要配置的东西),我们添加了一个String3。在不手动遍历.config文件的情况下,如何添加缺少的条目?当作为更新发布时(没有OneClick),现有的.config文件只有String1和String2。

虽然默认为String3,但应用程序不知何故理解缺少一个条目,因此应该有可能,或者我认为,将这个设置添加到默认值中,以便其他程序或用户不必手动键入整个标记,而不知道它的实际名称。

提前感谢!

Qudeid

以编程方式在.config文件中添加缺失的条目

大家好,

我刚刚编写了下面这段我想要的代码。

简单解释一下:我首先使用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();
}

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

这意味着如果你在项目中添加了一个设置,但没有在App.config文件中提供该设置的值,则该设置的值将是设置编辑器中分配的默认值。

重写在应用程序的App.config文件中分配的值。

因为你的应用程序可以被分割成由多个项目创建的多个程序集,所以没有办法自动执行在从属程序集中添加设置的过程,在主项目的App.config文件中为该设置创建一个条目。恐怕这件事你得自己做了。

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