1

Я следующие this Stackoverflow topic. Все работает на стороне чтения. Я получаю коллекцию, которую я преобразовываю в словарь содержимого раздела. Я публикую это в других проектах. Проблемы возникают, когда я пытаюсь сохранить измененную запись раздела. Один из внешних проектов отправляет пару ключ/значение, и мне нужно сохранить его в моем разделе. Вот мой App.ConfigНе удалось сохранить изменения в файле конфигурации

 <?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
     <configSections> 
      <section name="fileEnvironmentSection" type="MyApp.Infrastructure.Configuration.FileEnvironmentSection, MyApp.Infrastructure"/> 
     </configSections> 

     <fileEnvironmentSection> 
      <fileEnvironment> 
      <add key="TestEntry1" value="A nice value"/> 
      <add key="TestEntry2" value="Another value"/> 
      </fileEnvironment> 
     </fileEnvironmentSection> 
    </configuration> 

Вот три уровня типов, необходимые для взаимодействия с разделом конфигурации.

 using System.Configuration; 

    namespace SlamDunk.Infrastructure.Configuration { 
     public class FileEnvironmentSection : ConfigurationSection { 

      [ConfigurationProperty("fileEnvironment", IsDefaultCollection = false)] 
      [ConfigurationCollection(typeof(FileEnvironmentCollection), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] 
      public FileEnvironmentCollection FileEnvironmentList { 
       get { return (FileEnvironmentCollection)base["fileEnvironment"]; } 
      } 
     } 
    } 


    using System.Configuration; 

    namespace SlamDunk.Infrastructure.Configuration { 
     public class FileEnvironmentCollection : ConfigurationElementCollection { 

      public FileEnvironmentElement this[int index] { 
       get { return (FileEnvironmentElement)BaseGet(index); } 
       set { 
       if(BaseGet(index) != null) BaseRemoveAt(index); 
       BaseAdd(index, value); 
       } 
      } 

      public void Add(FileEnvironmentElement fileEnvironmentElement) { BaseAdd(fileEnvironmentElement); } 

      public void Clear() { BaseClear(); } 

      protected override ConfigurationElement CreateNewElement() { return new FileEnvironmentElement(); } 

      protected override object GetElementKey(ConfigurationElement element) { return ((FileEnvironmentElement)element).Key; } 

      public void Remove(FileEnvironmentElement fileEnvironmentElement) { BaseRemove(fileEnvironmentElement.Key); } 

      public void Remove(string key) { BaseRemove(key); } 

      public void RemoveAt(int index) { BaseRemoveAt(index); } 
     } 
    } 


    using System.Configuration; 

    namespace SlamDunk.Infrastructure.Configuration { 
     public class FileEnvironmentElement : ConfigurationElement { 

      private const string appConfigDefaultString = "missing"; 
      private const string _appConfigNameKey = "key"; 
      private const string _appConfigNameValue = "value"; 

      public FileEnvironmentElement() { } 

      public FileEnvironmentElement(string key, string value) { 
       Key = key; 
       Value = value; 
      } 

      [ConfigurationProperty(_appConfigNameKey, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = true)] 
      public string Key { 
       get { return (string)this[_appConfigNameKey]; } 
       set { this[_appConfigNameKey] = value; } 
      } 

      [ConfigurationProperty(_appConfigNameValue, DefaultValue = appConfigDefaultString, IsRequired = true, IsKey = false)] 
      public string Value { 
      get { return (string)this[_appConfigNameValue]; } 
      set { this[_appConfigNameValue] = value; } 
      } 
     } 
    } 

Вот код, который я использую для сохранения изменения ключа/стоимости.

 var appConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
    var fileEnvironmentSection = appConfiguration.GetSection("fileEnvironmentSection") as FileEnvironmentSection; 
    var fileEnvironmentList = fileEnvironmentSection.FileEnvironmentList; 
    fileEnvironmentList.Remove(key); 
    var element = new FileEnvironmentElement(key, value); 
    fileEnvironmentList.Add(element); 

    //appConfiguration.Save(ConfigurationSaveMode.Modified); 

    //fileEnvironmentSection.CurrentConfiguration.Save(ConfigurationSaveMode.Modified); 

    fileEnvironmentList.CurrentConfiguration.Save(ConfigurationSaveMode.Modified); 

Я проверил и изменения появятся в списке, как и ожидалось. Я попробовал два комментария с сохранением и последний. Я думаю, что я получаю новый экземпляр FileEnvironmentSection, чтобы избежать проблем с кешированием ConfigurationManager. После каждого тестового запуска я просматриваю файл MyApp.exe.config и не нахожу никаких изменений. Я что-то упускаю и могу использовать какую-то помощь, выясняя, что. Благодарю.

+1

Ну, я нашел изменения. Они входят в myApp.Console.vshost.exe.Config. Когда я запускаю myApp.exe вне VisualStudio, мои изменения находятся в файле myApp.exe.config. Вот тема [Stackoverflow] (http://stackoverflow.com/questions/8840904/app-config-are-not-saving-the-values), которая заставляет меня посмотреть в vshost.exe. Извините за ложную тревогу. – JimBoone

ответ

3
appConfiguration.Save(ConfigurationSaveMode.Modified, true); 

appConfiguration.Save(ConfigurationSaveMode.Full, true); 

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