используйте ConfigurationManager для хранения пользовательских значений в файле, отдельном от конфигурации приложения - PullRequest
4 голосов
/ 23 сентября 2011

Хорошо, я уже почти сдался.

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



Когда я использую это:

<appSettings file="user.config">
  </appSettings>

и user.config выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
  <add key="localSetting" value="localVal"/>
</appSettings>

Я могу использовать ConfigurationManager для ЧТЕНИЯ локальных настроек, но не для сохранения в файл.

var oldLocVal = ConfigurationManager.AppSettings["localSetting"]; 
ConfigurationManager.AppSettings.Set("localSetting", "newLocalValue"); // Doesn't save to file.



Если вместо этого мой файл user.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="localSetting" value="localVal"/>
  </appSettings>
</configuration>

Затем я хотел бы позвонить и сохранить AppSettings следующим образом:

var uMap = new ConfigurationFileMap("user.config");
var uConfig = ConfigurationManager.OpenMappedMachineConfiguration(uMap);
var oldLocalVarFromConfig = uConfig.AppSettings.Settings["localSetting"]; // NO
uConfig.AppSettings.Settings.Remove("localSetting");                      // NO
uConfig.AppSettings.Settings.Add("localSetting", "newValue");
uConfig.Save();

но он не позволит мне получить доступ к настройкам приложения конфигурации. (У него есть проблема приведения чего-либо как AppSettings)



Я также попытался использовать атрибуты configSource вместо file в элементе конфигурации приложения appSettings element.

Я использовал примеры здесь для помощи, но, к сожалению, этого было недостаточно.

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 23 сентября 2011

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

  private const string _path = @"E:\WhateverPath\User.config"

  static ConfigManager()        
    { 
        ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap()          
        { 
            ExeConfigFilename = _path
        }; 

        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

        // get some custom configuration section
        _someConfigSection = config.GetSection("SomeSection") as SomeSection; 

        // or just get app settings 
        _appSettingSection = config.AppSettings; 
    }

Возможно, попробуйте добавить этот способ, обязательно вызвав Save ()

_appSettingSection.Settings.Add("SomeKey", "SomeValue"); 

//make sure to call save
config.Save(); 
0 голосов
/ 23 сентября 2011

К чести, этот код здесь работает .

Кроме того, я создал простой сериализуемый объект XML, который сохранял себя на диск каждый раз, когда на нем вызывался Save.

...