以编程方式在.config文件中添加缺失的条目
本文关键字:添加 方式 编程 config 文件 | 更新日期: 2023-09-27 18:10:35
一个问题,我没有找到一个答案后,谷歌很长一段时间(然后很长时间休息,再次搜索)…
比如说,我在我的应用程序设置中有2个设置。String1和String2。进一步说,我们发布了产品,并开始添加次要特性(更多需要配置的东西),我们添加了一个String3。在不手动遍历.config文件的情况下,如何添加缺少的条目?当作为更新发布时(没有OneClick),现有的.config文件只有String1和String2。
虽然默认为String3,但应用程序不知何故理解缺少一个条目,因此应该有可能,或者我认为,将这个设置添加到默认值中,以便其他程序或用户不必手动键入整个标记,而不知道它的实际名称。
提前感谢!
Qudeid
大家好,
我刚刚编写了下面这段我想要的代码。
简单解释一下:我首先使用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项目定义的默认值。