5,550,131 members and growing! (19,193 online)
Email Password   helpLost your password?
Languages » C# » General     Intermediate

Application and component configuration

By Robin Galloway-Lunn

Application and component configuration from XML .config files.
C#Windows, .NET, .NET 1.0, Win2K, WinXPVS.NET2002, Visual Studio, Dev

Posted: 28 Mar 2003
Updated: 28 Mar 2003
Views: 108,620
Bookmarked: 42 times
Announcements
Want a new Job?



Search    
Advanced Search
Sitemap
12 votes for this Article.
Popularity: 3.92 Rating: 3.64 out of 5
2 votes, 16.7%
1
1 vote, 8.3%
2
1 vote, 8.3%
3
2 votes, 16.7%
4
6 votes, 50.0%
5

Sample Image - app_config.jpg

Sample Image - app_config1.jpg

Introduction

The .NET Framework provides a rich configuration API which is consistent for stand alone desktop applications and web applications. This article provides a brief discussion of XML application configuration in .NET using a stand alone application example.

Background

Most applications require some configuration parameters which represent durable user preferences (such as a favourites list) or environmental information such as a database connection string or DSN. Windows applications prior to .Net typically stored such information in "ini" files which allowed the application to specify high level sections with name-value pairs of many configuration options under each section. This data format can represent two level information quite easily but is inflexible. There is no possibility of extending the format to include three, four or n many levels of information.

The .Net framework includes configuration functionality that loads an application's configuration automatically at run time without programmer intervention. In the case of a stand alone application named blah.exe one must name the configuration file blah.exe.config and the framework will load and parse the config file automatically when blah.exe is run. The .config file format is XML specified here. The benefit of using XML is that the format is flexible, allowing developers to specify their own configuration section names, embed sections in one another to any useful level in a tidy human readable format while also providing an XPath style configuration query interface (see XPath specification at the W3C) which allows a programmer simple access to specific settings in a complex document.

The .Net configuration system is highly functional and allows one to configure all parts of the application, including mandating a specific version of the runtime, the remoting configuration, cryptography providers and networking. This article will only explore configuration settings relevant to application data.

An Example Configuration File

One can define custom sections and section groups into which name value pairs can be put. There are several handler types defined in the System.Configuration namespace. I have chosen to use the NameValueSectionHandler to manage my application's settings.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <!-- Register the "settings" section group and it's "font" and "database" 
sections.
-->
<configSections> <sectionGroup name="settings"> <section name="font"
type="System.Configuration.NameValueSectionHandler,
System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089,
Custom=null"
/> <section name="database"
type="System.Configuration.NameValueSectionHandler, System,
Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089, Custom=null"
/> </sectionGroup> </configSections> <settings> <font> <add key="family" value="Verdana" /> <add key="size" value="18" /> <add key="bold" value="false" /> </font> <database> <add key="dsn"
value="Initial Catalog=Northwind;Data Source=localhost;
Integrated Security=SSPI;"
/> <add key="sqlserver" value="true" /> </database> </settings> </configuration>

The document root element must always be the <configuration> element. The second <configSections> element describes to the framework how to process the following nodes and make them available to the programmer. A section group indicates an element that will hold custom section elements. A section indicates and element that will hold actual configuration information and how the information will be organized.

Code Sample

So now that we have a configuration file with some simple font and database configuration data, let's read the settings in the application. This is remarkably simple to do for the example configuration file specified above using two classes in the framework: System.Configuration.ConfigurationSettings and System.Collections.Specialized.NameValueCollection.

// Font settings are represented by name-value pairs.  
//The font settings are located with an XPath expression.
NameValueCollection fontConfig = (NameValueCollection)
ConfigurationSettings.GetConfig("settings/font"); // Configure the mandatory font family. if(fontConfig["family"] == null) { throw(new ConfigurationException("Mandatory font family setting not found.")); } else { fontFamilyTextBox.Text = fontConfig["family"]; }

The ConfigurationSettings.GetConfig static method looks up elements under the <configuration> element using an XPath query notation. "settings/font" indicates the <font> element under the <settings> element under <configuration> root element. This returns a NameValueCollection from which settings can be looked up with the string indexer as shown above, using the name of the setting to find the corresponding value. Settings that are absent from the configuration will return null from the NameValueCollection indexer. Values are returned as strings.

The sample application included with this article queries the configuration file for the font and database settings and puts the values into the GUI components. Play with the configuration file, change the values, comment out some configuration settings and re-run the demo program to see how it responds to the changes. The source code project included with this article demonstrates how to specify some mandatory and some optional parameters, setting defaults for missing optional parameters and showing error messages for mandatory settings. It also shows conversion of some values into numbers and boolean structs, but you surely already know how to do that. ;-)

The possibilities for configuration are much more extensive, including writing your own settings validator and loader class such as the one that is shipped with the log4net software. The documentation hints that one can change the loaded configuration and save the changes, but I haven't made a serious effort to find out how. Perhaps another article about this later.

Share and enjoy.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Robin Galloway-Lunn



Occupation: Architect
Location: United Kingdom United Kingdom

Other popular C# articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 18 of 18 (Total in Forum: 18) (Refresh)FirstPrevNext
Subject  Author Date 
GeneralSection handler pathmembersunil_s2:32 13 Apr '05  
GeneralRead another project's configmemberkevin_yklee21:42 25 Jan '05  
GeneralsedIConfigurationSectionHandlereditorHeath Stewart19:46 21 Aug '03  
GeneralRe: sedIConfigurationSectionHandlermemberRobin Galloway-Lunn11:31 26 Aug '03  
GeneralRe: sedIConfigurationSectionHandlermemberWilliam Forney3:08 8 Sep '04  
Generalit doesn't work if I debug or start app from VS .NetmemberBogdan Gonciulea5:31 27 Jun '03  
GeneralRe: it doesn't work if I debug or start app from VS .NetmemberBogdan Gonciulea6:19 27 Jun '03  
GeneralRe: it doesn't work if I debug or start app from VS .NetmemberRobin Galloway-Lunn23:47 27 Jun '03  
GeneralThese .config are read only!memberJoe11310:28 18 Jun '03  
GeneralRe: These .config are read only!memberRobin Galloway-Lunn23:45 27 Jun '03  
GeneralRe: These .config are read only!editorHeath Stewart19:38 21 Aug '03  
GeneralRe: These .config are read only!memberRobin Galloway-Lunn11:26 26 Aug '03  
GeneralRe: These .config are read only!sussAnonymous6:12 17 Mar '04  
GeneralRe: These .config are read only!editorHeath Stewart3:39 19 Mar '04  
GeneralEvery try this?memberMike McPhail11:37 14 Apr '03  
GeneralRe: Every try this?memberRay Cassick11:50 14 Apr '03  
GeneralRe: Every try this?sussAnonymous18:36 28 Apr '03  
GeneralRe: Every try this?editorHeath Stewart19:42 21 Aug '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 28 Mar 2003
Editor: Chris Maunder
Copyright 2003 by Robin Galloway-Lunn
Everything else Copyright © CodeProject, 1999-2008
Web11 | Advertise on the Code Project