使用 ConfigurationManager 将用户值存储在与应用配置不同的文件中

Posted

技术标签:

【中文标题】使用 ConfigurationManager 将用户值存储在与应用配置不同的文件中【英文标题】:use ConfigurationManager to store user values in a file that is separate from the app config 【发布时间】:2011-11-23 06:08:25 【问题描述】:

好吧,我已经放弃了。

我希望能够使用用户配置文件记录用户首选项,该文件将从应用程序配置文件中引用。我正在尝试使用ConfigurationManager 和一个应用程序配置文件来做到这一点。我可以从用户设置中很好地阅读,但设置它们是另一个问题。我想将应用程序设置与两个不同文件中的用户设置分开。



当我使用这个时:

<appSettings file="user.config">
  </appSettings>

user.config 看起来像:

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
  <add key="localSetting" value="localVal"/>
</appSettings>

我可以使用 ConfigurationManager 读取本地设置,但不能保存到文件中。

var oldLocVal = ConfigurationManager.AppSettings["localSetting"]; 
ConfigurationManager.AppSettings.Set("localSetting", "newLocalValue"); // Doesn't save to file.



如果相反,我的 user.config 文件是:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="localSetting" value="localVal"/>
  </appSettings>
</configuration>

然后我想以这种方式调用并保存 AppSettings:

var uMap = new ConfigurationFileMap("user.config");
var uConfig = ConfigurationManager.OpenMappedMachineConfiguration(uMap);
var oldLocalVarFromConfig = uConfig.AppSettings.Settings["localSetting"]; // NO
uConfig.AppSettings.Settings.Remove("localSetting");                      // NO
uConfig.AppSettings.Settings.Add("localSetting", "newValue");
uConfig.Save();

但它不允许我访问配置的应用设置。 (将某些内容转换为 AppSettings 时出现问题)



我还尝试在应用程序配置 appSettings 元素中使用 configSource 而不是 file 属性。

我使用examples here 寻求帮助,但不幸的是这还不够。

提前致谢。

【问题讨论】:

【参考方案1】:

值得称赞的是,this code here works。

另外,我制作了一个简单的 XML 可序列化对象,它可以在任何时候调用 Save 时将自身保存到磁盘。

【讨论】:

【参考方案2】:

您可以将外部配置文件加载到“配置”实例中。这是一个带有使用此策略的静态构造函数的单例类的示例。我想你可以稍微调整一下来做你想做的事。

  private const string _path = @"E:\WhateverPath\User.config"

  static ConfigManager()        
     
        ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap()          
         
            ExeConfigFilename = _path
        ; 

        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

        // get some custom configuration section
        _someConfigSection = config.GetSection("SomeSection") as SomeSection; 

        // or just get app settings 
        _appSettingSection = config.AppSettings; 
    

也许尝试以这种方式添加,确保调用 Save()

_appSettingSection.Settings.Add("SomeKey", "SomeValue"); 

//make sure to call save
config.Save(); 

【讨论】:

太好了,显然我尝试过 OpenExeConfiguration 和 OpenMappedMachineConfiguration,但这是可行的。

以上是关于使用 ConfigurationManager 将用户值存储在与应用配置不同的文件中的主要内容,如果未能解决你的问题,请参考以下文章

ConfigurationManager.AppSettings性能问题

使用 ConfigurationManager 从任意位置加载配置

在类库的 App.config 中使用 ConfigurationManager.GetSection

建议在 .NET 核心中使用 app.config 和 ConfigurationManager 吗?

如何在类库项目类型中使用 ConfigurationManager 类

如何使用ConfigurationManager? (Microsoft.IdentityModel.Protocols)