Как записать в файл User.Config через ConfigurationManager?

Я пытаюсь сохранить пользовательские настройки в файле конфигурации с помощью ConfigurationManager.

Я хочу распространить эти настройки только на пользователя, потому что изменения приложений не могут быть сохранены в Vista / Win 7 без прав администратора.

Кажется, это дает мне конфигурацию пользователя, которая, похоже, сохранена здесь, в Win 7 ([Диск]: \ Users \ [Имя пользователя] \ AppData \ Local \ [ApplicationName] \ [AssemblyName] [hash] \ [Version \) »

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);

Всякий раз, когда я пытаюсь сохранить какие-либо изменения в этой конфигурации, я получаю следующее исключение:

InnerException: System.InvalidOperationException
Message="ConfigurationSection properties cannot be edited when locked."
Source="System.Configuration"
StackTrace:
    at System.Configuration.SectionInformation.VerifyIsEditable()
    at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates& definitionUpdates, ArrayList& configSourceUpdates)

Я пробовал добавить в эту конфигурацию настраиваемую секцию ConfigurationSection. Я пробовал добавить в AppSettingsSection. Всякий раз, когда я вызываю config.Save(), он выдает исключение, указанное выше.

Любые идеи?

Я пробовал использовать класс ApplicationSettingsBase через конструктор Project-> Settings, но похоже, что с его помощью вы не можете сохранять пользовательские типы. Мне нужна аналогичная функциональность с возможностью сохранения пользовательских типов.


person Josh G    schedule 13.04.2010    source источник
comment
Оказывается, вы МОЖЕТЕ использовать custom to типы с помощью конструктора Project- ›Settings. Они не перечисляют их в диалоговом окне типа, но если вы введете правильное имя / пространство имен, вы можете использовать любой тип, который хотите. Тип должен быть XmlSerializable или преобразованным в / из строки с помощью TypeConverter.   -  person Josh G    schedule 11.05.2011


Ответы (1)


Вам необходимо установить значение SectionInformation.AllowExeDefinition для раздела:

 Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
UserSettings settings;
if ((settings = (UserSettings)configuration.Sections[GENERAL_USER_SETTINGS]) == null)
{
      settings = new UserSettings();
      settings.SectionInformation.AllowExeDefinition =   
                 ConfigurationAllowExeDefinition.MachineToLocalUser;
      configuration.Sections.Add(GENERAL_USER_SETTINGS, settings);
      configuration.Save();
}

Значение по умолчанию - ConfigurationAllowExeDefinition.MachineToApplication, которое позволяет размещать раздел только в machine.config и app.exe.config.

person Jay    schedule 13.04.2010
comment
Я попробую это. Я попытался установить свойство AllowExeDefinition один раз и вызвал то же исключение, что и config.Save (). Я скопирую этот фрагмент кода и попробую еще раз. - person Josh G; 14.04.2010
comment
Похоже, мне нужно было установить AllowExeDefinition ПЕРЕД добавлением раздела и сохранением изменений в первый раз. Теперь вроде все работает нормально. - person Josh G; 14.04.2010
comment
по какой-то причине использование ConfigurationManager.OpenExeConfiguration с перегрузкой ConfigurationUserLevel не позволило мне редактировать и сохранять файл, утверждая, что свойства ConfigurationSection нельзя редактировать, когда заблокировано. только когда я использовал перегрузку string exepath, я смог сохранить конфигурацию. - person itsho; 07.01.2013
comment
Я только что столкнулся с этим. Я исправил это, обновив новый раздел перед добавлением его в коллекцию config.Sections. - person Darrel Lee; 18.07.2016