【问题标题】:How to Write to a User.Config file through ConfigurationManager?如何通过 ConfigurationManager 写入 User.Config 文件?
【发布时间】:2011-02-07 15:15:18
【问题描述】:

我正在尝试使用 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)

我已尝试向此配置添加自定义 ConfigurationSection。我尝试添加到 AppSettingsSection。每当我调用config.Save() 时,它都会抛出上面的异常。

有什么想法吗?

我尝试通过 Project->Settings 设计器使用 ApplicationSettingsBase 类,但您似乎无法使用它保存自定义类型。我想要具有保存自定义类型的类似功能。

【问题讨论】:

  • 原来你可以通过 Project->Settings 设计器使用自定义类型。他们没有在类型对话框中列出它们,但是如果您输入正确的名称/命名空间,您可以使用任何您想要的类型。类型应该是 XmlSerializable 或可通过 TypeConverter 转换为字符串。

标签: c# .net configuration-files configurationmanager 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 上。

【讨论】:

  • 我会试试的。我尝试设置 AllowExeDefinition 属性一次并导致 config.Save() 触发相同的异常。我将复制此代码段并重试。
  • 看来我需要在添加部分和第一次保存更改之前设置 AllowExeDefinition。现在一切似乎都运行良好。
  • 由于某种原因,使用 ConfigurationManager.OpenExeConfigurationConfigurationUserLevel 重载,不允许我通过声称 ConfigurationSection 属性在锁定时无法编辑。只有当我使用了 string exepath 重载时,我才能保存配置。
  • 我刚遇到这个。我通过在将新部分添加到 config.Sections 集合之前更新它来修复它。
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 2010-12-31
  • 2016-06-12
  • 2016-08-03
  • 1970-01-01
  • 2015-10-06
  • 2021-09-30
  • 2011-09-22
相关资源
最近更新 更多