Как записать в файл User.Config через ConfigurationManager? - PullRequest
11 голосов
/ 14 апреля 2010

Я пытаюсь сохранить настройки пользователя в файле конфигурации с помощью 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)

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

Есть идеи?

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

1 Ответ

8 голосов
/ 14 апреля 2010

Вам необходимо установить значение 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.

...