Reputation: 6700
Ok, I've just about given up on this.
I would like to be able to record user preferences using a user config file, which would be referenced from the app config file. I am trying to do this with ConfigurationManager
and an app config file. I can read just fine from the user settings, but setting them is a whole other problem. I would like to keep the app settings separate from the user settings in two different files.
When I use this:
<appSettings file="user.config">
</appSettings>
and user.config looks like:
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="localSetting" value="localVal"/>
</appSettings>
I can use ConfigurationManager to READ the local setting, but not to save to the file.
var oldLocVal = ConfigurationManager.AppSettings["localSetting"];
ConfigurationManager.AppSettings.Set("localSetting", "newLocalValue"); // Doesn't save to file.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="localSetting" value="localVal"/>
</appSettings>
</configuration>
I would then like to call and save the AppSettings in this way:
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();
but it won't let me access the configuration's app settings. (It has a problem casting something as an AppSettings)
configSource
instead of file
attributes in the app config appSettings
element.
I was using the examples here for help, but unfortunately it wasn't enough.
Thanks in advance.
Upvotes: 4
Views: 6177
Reputation: 6700
To its credit, this code here works.
Also, I made a simple XML serializable object that saved itself to disk any time Save was called on it.
Upvotes: 0
Reputation: 7489
You can load external config files into a 'Configuration' instance. Here is an example of a singleton class with a static constructor that uses this strategy. You can tweak it a bit to do what you want, I think.
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;
}
Maybe try adding this way, making sure to call Save()
_appSettingSection.Settings.Add("SomeKey", "SomeValue");
//make sure to call save
config.Save();
Upvotes: 5