views:

10847

answers:

11

I'm really new to .NET and I still didn't get the hang about how config files work.

Every time I search on google about it I get results about web.config, but I'm writing a windows forms application.

I figured out that I need to use the System.Configuration namespace but I'm kinda dumb and the documentation isn't helping.

How do I define that my config file is XYZ.xml? Or does it have a "default" name for the config file name? I still didn't get that.

Also, how do I define a new section, do I really need to create a class which inherits from ConfigurationSection?

I would like to just have a config file with some values like this:

<MyCustomValue>1</MyCustomValue>
<MyCustomPath>C:\Some\Path\Here</MyCustomPath>

Is there a simple way to do it? Can you examplain in a simple way how to read and write from/to asimple configuration file?

A: 

What version of .Net and VS are you using?

When you created the new project, you should have a file in your solution called app.config, that is the default configuration file.

Geoff
+18  A: 

You want to use an App.Config.

When you add a new item to a project there is something called Applications Configuration file. Add that.

Then you add keys in the configuration/appsettings section

Like:

<configuration>
 <appSettings>
  <add key="MyKey" value="false"/>

Access the members by doing

System.Configuration.ConfigurationSettings.AppSettings["MyKey"];

This works in .net 2 and above.

qui
That was really simple, 2 minutes and I had the configuration working, thanks!
Fabio Gomes
Actually it works in all versions of .NET, from v1.0 onwards. The new class in .NET 2.0 is ConfigurationManager.
Mike Dimmick
I personally use the "Settings" tab on the "Application Properties" (Framework 2.0 onwards only) because Visual Studio will code-gen strongly typed properties for your settings. They can also include "User" settings which are read/write at run time.
Aydsman
@Mike yeah i had a feeling that was the case, but I wasn't too sure. I have not worked much with 1.
qui
+2  A: 

The best ( IMHO ) article about .NET Application configuration is on CodeProject Unraveling the Mysteries of .NET 2.0 Configuration. And my next favorite (shorter) article about sections in .net configuration files is Understanding Section Handlers - App.config File.

TcKs
It really isn't not the simplest way asked by the user, but Unraveling the mysteries of .NET 2.0 configurations are really a great series of articles.
Ricky AH
+1  A: 

In Windows forms, you have an app.config, which is very similar to web.config. But since what I see you need it for are custom values, I suggest using Settings. To do that, open your project properties, then go to settings. If a settings file does not exist you will have a link to create one. Then, you can add the settings to the table you see there, which would generate both the appropriate XML, and a Settings class that can be used to load and save the settings. The settings class will be named something like DefaultNamespace.Properties.Settings. Then, you can use code similar to:

using DefaultNamespace.Properties;

namespace DefaultNamespace {
    class Class {
        public int LoadMySettingValue() {
            return Settings.Default.MySettingValue;
        }
        public void SaveMySettingValue(int value) {
            Settings.Default.MySettingValue = value;
        }
    }
}
configurator
+3  A: 

You should create an App.config file (very similar to web.config)

You should right click on your project, add new item, new "Application Configuration File".

Ensure that you add using System.Configuration to your project.

Then you can add values to it

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="setting1" value="key"/>
  </appSettings>
  <connectionStrings>
    <add name="prod" connectionString="YourConnectionString"/>
  </connectionStrings>
</configuration>


    private void Form1_Load(object sender, EventArgs e)
    {
        string setting = ConfigurationManager.AppSettings["setting1"];
        string conn = ConfigurationManager.ConnectionStrings["prod"].ConnectionString;
    }


Just a note, according to Microsoft, you should use ConfigurationManager instead of ConfigurationSettings. (see the remarks section) "The ConfigurationSettings class provides backward compatibility only. For new applications you should use the ConfigurationManager class or WebConfigurationManager class instead. "

Nathan Koop
+1  A: 

The default name for a configuration file is [yourexe].exe.config. So notepad.exe will have a configuration file named notepad.exe.config, in the same folder as the program. This is a general configuration file for all aspects of the CLR and Framework, but can contain your own settings under an <appSettings> node.

The <appSettings> element creates a collection of name-value pairs which can be accessed as System.Configuration.ConfigurationSettings.AppSettings. There is no way to save changes back to the configuration file, however.

It is also possible to add your own custom elements to a configuration file - for example, to define a structured setting - by creating a class that implements IConfigurationSectionHandler and adding it to the <configSections> element of the configuration file. You can then access it by calling ConfigurationSettings.GetConfig.

.NET 2.0 adds a new class, System.Configuration.ConfigurationManager, which supports multiple files, with per-user overrides of per-system data. It also supports saving modified configurations back to settings files.

Visual Studio creates a file called App.config, which it copies to the EXE folder, with the correct name, when the project is built.

Mike Dimmick
+17  A: 

Clarification of previous answers...

1) Add a new file to your project (Add->New Item->Application Configuration File)

2) The new config file will appear in Solution Explorer as App.Config.

3) Add your settings into this file using the following as a template

<configuration>
  <appSettings>
    <add key="setting1" value="key"/>
  </appSettings>
  <connectionStrings>
    <add name="prod" connectionString="YourConnectionString"/>
  </connectionStrings>
</configuration>

4)Retrieve them like this :

private void Form1_Load(object sender, EventArgs e)
{
    string setting = ConfigurationManager.AppSettings["setting1"];
    string conn = ConfigurationManager.ConnectionStrings["prod"].ConnectionString;
}

5) When built, your output folder will contain a file called <assemblyname>.exe.config This will be a copy of the App.Config file. No further work should need to be done by the developer to create this file.

ZombieSheep
+2  A: 

I agree with the other answers that point you to app.config. However, rather than reading values directly from app.config, you should create a utility class (AppSettings is the name I use) to read them and expose them as properties. The AppSettings class can be used to aggregate settings from several stores, such as values from app.config and application version info from the assembly (AssemblyVersion and AssemblyFileVersion).

Jamie Ide
+8  A: 

From a quick read of the previous answers, they look correct, but it doesn't look like anyone mentioned the new configuration facilities in VS 2008. It still uses app.config (copied at compile time to YourAppName.exe.config), but there is a UI widget to set properties and specifiy their types. Double-click Settings.settings in your project's "Properties" folder.

The best part is that accessing this property from code is typesafe - the compiler will catch obvious mistakes like mistyping the property name. For example, a property called MyConnectionString in app.config would be accessed like:

string s = Properties.Settings.Default.MyConnectionString;
maxfurni
This was available in VS2005.
Greg D
A: 

System.Configuration.ConfigurationSettings.AppSettings["MyKey"];

AppSettings has been deprecated and is now considered obsolete. [ link ]

In addition the appSettings section of the app.config has been replaced by the applicationSettings section.

As someone else mentioned, you should be using System.Configuration.ConfigurationManager [ link ] which is new for .Net 2.0

+1  A: 

A very simple way of doing this is to use your your own custom Settings class.

Protagonist
+1 for the less verbose link to ApplicationSettings at http://msdn.microsoft.com/en-us/library/system.configuration.applicationsettingsbase.aspx which seems simpler than ConfigurationManager implementations. Get/set settings, don't care about "XML Shaping".
maxwellb