一个问题我谷歌搜索了很长时间后没有找到答案(然后长时间休息并再次搜索)......
说,我的应用程序设置中有2个设置。 String1和String2。更进一步说,我们发布了产品并开始添加次要功能(需要配置更多内容),我们添加了一个String3。 如果不手动遍历.config文件,我可以添加缺少的条目吗?当作为更新发布时(没有OneClick btw。),现有的.config文件只有String1和String2。
虽然默认为String3,但应用程序以某种方式理解缺少一个条目,因此应该可以,或者我认为,应该使用默认值添加这一个设置,以便其他程序或用户不会不必手动输入整个标签,而不知道它到底是什么名字。
提前致谢!
Qudeid
答案 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项目定义的默认值。