Drew
Drew

Reputation: 2631

how to use an external configuration file with WPF?

i would like to set up an external configuration file that I can store in a directory for my WPF app, not necessarily the directory of my exe when I create my program either.

I created an App.Config file and added System.Configuration to my assembly. My App.Config has:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings file="sd.config">
   <add key="username" value="joesmith" />
  </appSettings>
</configuration>

and my sd.config (external file) which is in the root of my project for now, has

<?xml version="1.0"?>
 <appSettings>
   <add key="username1" value="janedoe" />
</appSettings>

in my MainWindow cs class I used

string username = ConfigurationManager.AppSettings.Get("username1");

which returns a null string. when i just retrieve the username field from App.Config it works. What did i miss? Thanks so much!

Upvotes: 0

Views: 4757

Answers (1)

Dan J
Dan J

Reputation: 16718

See the documentation on ConfigurationManager:

The AppSettings property:

Gets the AppSettingsSection data for the current application's default configuration.

You need to do a little extra work to get data that isn't in your application's default configuration file.

Instead of using the file= attribute, add a key to your <appSettings> that defines the location of the secondary config file, like so:

<add key="configFile" value="sd.config"/>

Then, in order to use ConfigurationManager to pull settings from the secondary config file, you need to use its OpenMappedExeConfiguration method, which should look a little something like this:

var map = new ExeConfigurationFileMap();
map.ExeConfigFilename = Path.Combine(
      AppDomain.CurrentDomain.SetupInformation.ApplicationBase, 
      ConfigurationManager.AppSettings["configFile"]
);

//Once you have a Configuration reference to the secondary config file, 
//you can access its appSettings collection:
var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

var userName1 = config.AppSettings["username1"];

That code might not be dead-on for your example, but hopefully it gets you on the right track!

Upvotes: 5

Related Questions