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

c#forms-以编程方式在.config文件中添加缺少的条目,c#,forms,settings,app-config,C#,Forms,Settings,App Config,这个问题我在谷歌搜索了很长一段时间后还没有找到答案(然后很长一段时间都没有找到答案,然后又重新搜索了一下) 比如说,我的应用程序设置中有两个设置。String1和String2。进一步说,我们发布了产品,开始添加次要功能(更多需要配置的内容),并添加了String3。 如何在不手动遍历.config文件的情况下添加缺少的条目?作为更新发布时(不带一键点击),现有的.config文件只有String1和String2 在默认设置String3时,应用程序不知何故理解缺少一个条目,因此应该可以(或者

这个问题我在谷歌搜索了很长一段时间后还没有找到答案(然后很长一段时间都没有找到答案,然后又重新搜索了一下)

比如说,我的应用程序设置中有两个设置。String1和String2。进一步说,我们发布了产品,开始添加次要功能(更多需要配置的内容),并添加了String3。 如何在不手动遍历.config文件的情况下添加缺少的条目?作为更新发布时(不带一键点击),现有的.config文件只有String1和String2

在默认设置String3时,应用程序不知何故理解缺少一个条目,因此应该可以(或者我认为)使用默认值添加这个设置,以便其他程序或用户不必手动键入整个标记,而不知道它真正的名称

提前谢谢


Qudeid

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

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

若要覆盖该值,请在应用程序的App.config文件中分配该值

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

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

我刚刚编写了下面一段代码,它可以根据我的需要为我工作

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

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

ConfigurationSectionGroup-sectionGroup=configFile.SectionGroups[“应用程序设置”];
关于这一行:

ConfigurationSectionGroup-sectionGroup=configFile.SectionGroups[“用户设置”];
因为这是该节的对应名称。但不能保证

这是我的密码:

//
///加载自己的配置文件并将其内容与设置进行比较,并添加缺少的条目
///将其默认值添加到文件中并保存。
/// 
私有void更新设置()
{
//加载.config文件
Configuration configFile=ConfigurationManager.OpenExeConfiguration(typeof(Settings).Assembly.Location);
//得到通缉组
ConfigurationSectionGroup sectionGroup=configFile.SectionGroups[“应用程序设置”];
ClientSettingsSection clientSettings=(ClientSettingsSection)sectionGroup.Sections[0];
//确保以后确实保存了该节
clientSettings.SectionInformation.ForceSave=true;
//遍历所有属性
foreach(Settings.Default.Properties中的SettingsProperty属性)
{
//如果设置中的任何元素等于该属性的名称,则我们知道该属性存在于文件中
bool exists=clientSettings.Settings.Cast().Any(element=>element.Name==property.Name);
//如果元素恰好不存在,则使用默认值创建SettingElement。
如果(!存在)
{
var element=new setingelement(property.Name,property.SerializeAs);
var-xElement=new-xElement(XName.Get(“value”);
XmlDocument doc=新的XmlDocument();
XmlElement valueXml=doc.ReadNode(xElement.CreateReader())作为XmlElement;
valueXml.InnerText=property.DefaultValue.ToString();
element.Value.ValueXml=ValueXml;
clientSettings.Settings.Add(元素);
}
}
//保存配置
configFile.Save();
}

为什么不能像打开XML文档一样打开.config文件(使用
XDocument
)并根据需要修改它呢?我可以。这不是重点。我认为可能有一种更优雅的方法可以实现自动化,而无需编写代码。也许我错过了,大概是吧。我完全可以将文件编辑为XML,甚至可以使用反射来检查是否缺少某些内容。可以说,只是不想重新发明轮子。那么,基本上,你是说app.config只是一个覆盖?然后,比如说,我必须使用反射来获取Settings类中的所有属性,然后将其与实际文件进行比较。如果缺少某些内容,是否应添加条目?我很清楚,这只是一个XML文件,因为我正在一个单独的程序中配置它,该程序加载另一个程序的配置文件,然后处理这些值。但如果缺少一个条目,则无法添加条目。