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

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

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

Кажется, это дает мне конфигурацию пользователя, которая, как представляется, сохраняется здесь в Win 7 ([Drive]:\Users\[Username]\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)

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

Любые идеи?

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

Ответ 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.