C # формы - программно добавить недостающие записи в файле .config - PullRequest
1 голос
/ 04 октября 2011

вопрос, на который я не нашел ответа после долгого поиска в Google (затем долгого перерыва и повторного поиска) ...

Скажите, у меня есть 2 Настройки в моем приложениинастройки.Строка1 и Строка2.Скажем, далее, мы отправили продукт и начали добавлять незначительные функции (больше вещей для настройки), и мы добавляем String3.Как без обхода файла .config вручную добавить недостающие записи?При поставке в качестве обновления (без использования OneClick) существующий файл .config содержит только String1 и String2.

Хотя по умолчанию для String3, приложение каким-то образом понимает, что запись отсутствует, поэтому это должно быть возможно,или так, я думаю, чтобы добавить этот параметр со значением по умолчанию, чтобы другой программе или пользователю не приходилось вводить целые теги вручную, не зная, какое это имя на самом деле.

Спасибозаранее!

Qudeid

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Привет, ребята, снова,

Я только что написал следующий фрагмент кода, который работает для меня так, как я хотел.

Просто чтобы объяснить это немного: Сначала я открываю файл конфигурации с помощью 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();
}
0 голосов
/ 04 октября 2011

Когда вы создаете параметр в Visual Studio (Проект -> Свойства -> Settings.settings), вы присваиваете значение этому параметру в редакторе настроек. Из определения настроек (на самом деле XML-файл) генерируется файл кода с классом, который дает вам доступ к настройкам. Этот класс по умолчанию будет использовать значение, назначенное настройке в редакторе настроек. Однако при доступе к настройке он будет искать значение этого параметра в файле App.config. Если есть значение, оно переопределит значение по умолчанию в файле, сгенерированном кодом.

Это означает, что если вы добавляете параметр в свой проект, но не предоставляете значение для этого параметра в файле App.config, значение параметра будет значением по умолчанию, назначенным в редакторе настроек.

Чтобы переопределить значение, присвойте его в файле App.config для приложения.

Поскольку ваше приложение можно разбить на несколько сборок, созданных несколькими проектами, невозможно автоматизировать процесс, когда добавление параметра в зависимую сборку создает запись для этого параметра в файле App.config для основного проекта. Боюсь, ты должен сделать это сам.

Но в этом и заключается прелесть системы: два .exe-проекта могут зависеть от одного и того же .dll-проекта, который определяет параметр. В каждом проекте .exe вы можете переопределить настройку в файле App.config для проекта .exe или можете использовать значение по умолчанию, определенное проектом .dll.

...