代码之家  ›  专栏  ›  技术社区  ›  Josh G

如何通过configurationmanager写入user.config文件?

  •  11
  • Josh G  · 技术社区  · 16 年前

    我正在尝试使用configurationmanager将用户设置保存到配置文件中。

    我只想将这些设置作用于用户,因为没有管理员权限,应用程序更改无法保存在vista/win 7上。

    这似乎得到了用户的配置,它似乎保存在win 7([驱动器]:\user s\[用户名]\appdata\local\[应用程序名]\[程序集名][哈希]\[版本]中

    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)
    

    我已尝试将自定义配置节添加到此配置中。我已尝试添加到appsettings部分。每次我打电话 config.Save() 它抛出了上面的异常。

    有什么想法吗?

    我曾尝试通过项目设置设计器使用applicationsettingsbase类,但似乎无法用此保存自定义类型。我想要类似的功能,能够保存自定义类型。

    1 回复  |  直到 9 年前
        1
  •  8
  •   Adam Kalnas    14 年前

    需要为节设置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上。