我们经常会希望在程序中写入一些配置信息,例如版本号,以及数据库的连接字符串等。你可能知道在WinForm应用程序中可以利用Properties.Settings来进行类似的工作,但这些其实都利用了App.config配置文件。本文探讨用代码的方式访问 App.config 的方法

1. 配置文件概述: 
应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。

常见配置文件模式:

<configuration>
<configSections> //配置节声明区域,包含配置节和命名空间声明
<section> //配置节声明
<sectionGroup> //定义配置节组
<section> //配置节组中的配置节声明
<appSettings> //预定义配置节
<Custom element for configuration section> //配置节设置区域

2. config配置文件配置节

(1)普通配置节

  <appSettings>
<add key="ConnStr1" value="User ID=sa;Data Source=.;Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" />
</appSettings>

(2)数据源配置节

  <connectionStrings>
<add name="ConnStr2" connectionString="LocalSqlServer: data source=127.0.0.1;Integrated Security=SSPI;Initial Catalog=aspnetdb" providerName="System.Data.SqlClient" />
</connectionStrings>

完整如下

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ConnStr1" value="User ID=sa;Data Source=.;Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" />
</appSettings> <connectionStrings>
<add name="ConnStr2" connectionString="LocalSqlServer: data source=127.0.0.1;Integrated Security=SSPI;Initial Catalog=aspnetdb"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>

下面来看看这样的配置文件如何访问

①添加引用 System.Configuration

②引入命名空间

using System.Configuration;
string _connStr1 = ConfigurationManager.AppSettings["ConnStr1"];
string _connStr2 = ConfigurationManager.ConnectionStrings["ConnStr2"].ToString();

(3)自定义配置节   一个用户自定义的配置节,在配置文件中分为两部分:

首先在<configSections></ configSections>配置节中声明配置节(上面配置文件模式中的“<section>”)

 <configSections>
<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>
</configSections>

然后是在<configSections></ configSections >之后设置配置节(上面配置文件模式中的“<Custom element for configuration section>”),有点类似一个变量先声明,后使用一样。

<Test1>
<add key="Hello" value="World" />
</Test1>

声明一个配置文件的语句如下:

<section name=" " type=" "/> 
section:声明新配置节,即可创建新配置节。
name: 自定义配置节的名称。
type: 自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、System.Configuration.DictionarySectionHandler、System.Configuration.NameValueSectionHandler。

不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。

type的类型有许多,参见 System.Configuration 命名空间

下面我们就举一个配置文件的例子,让它包含这三个不同的type。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!--声明了一个配置节它的名字叫Test1,类型为SingleTagSectionHandler-->
<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>
<section name="Test2" type="System.Configuration.DictionarySectionHandler"/>
<section name="Test3" type="System.Configuration.NameValueSectionHandler" />
</configSections> <!--设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多-->
<Test1 setting1="Hello" setting2="World"/>
<Test2>
<add key="Hello" value="World" />
</Test2>
<Test3>
<add key="Hello" value="World" />
</Test3>
</configuration>

下面我们看在程序中如何访问这些自定义的配置节。

我们通过ConfigurationManager类的静态方法GetSection来获取自定义配置节的信息。

using System.Configuration;
using System.Collections;
using System.Collections.Specialized; //访问配置节Test1
IDictionary IDTest1 = (IDictionary)ConfigurationManager.GetSection("Test1");
string str = (string)IDTest1["setting1"] + " " + (string)IDTest1["setting2"];
MessageBox.Show(str); //输出Hello World //访问配置节Test1的方法2
string[] values1 = new string[IDTest1.Count];
IDTest1.Values.CopyTo(values1, );
MessageBox.Show(values1[] + " " + values1[]); //输出Hello World //访问配置节Test2
IDictionary IDTest2 = (IDictionary)ConfigurationManager.GetSection("Test2");
string[] keys = new string[IDTest2.Keys.Count];
string[] values = new string[IDTest2.Keys.Count];
IDTest2.Keys.CopyTo(keys, );
IDTest2.Values.CopyTo(values, );
MessageBox.Show(keys[] + " " + values[]); //访问配置节Test3
NameValueCollection nc = (NameValueCollection)ConfigurationManager.GetSection("Test3");
MessageBox.Show(nc.AllKeys[].ToString() + " " + nc["Hello"]); //输出Hello World

通过上面的代码我们可以看出,不同的type通过GetConfig返回的类型不同,具体获得配置内容的方式也不一样。

配置节处理程序返回类型

SingleTagSectionHandler
System.Collections.IDictionary DictionarySectionHandler
System.Collections.IDictionary NameValueSectionHandler
System.Collections.Specialized.NameValueCollection

3 自定义配置节组 
配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于<sectionGroup>元素中。下面是一个包含配置节组的配置文件的例子:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="TestGroup">
<section name="Test" type="System.Configuration.NameValueSectionHandler"/>
</sectionGroup>
</configSections> <TestGroup>
<Test>
<add key="Hello" value="World"/>
</Test>
</TestGroup>
</configuration>

下面是访问这个配置节组的代码:

NameValueCollection nc = (NameValueCollection)ConfigurationManager.GetSection("TestGroup/Test");
MessageBox.Show(nc.AllKeys[].ToString() + " " + nc["Hello"]); //输出Hello World

4.appSettings配置节的读写操作

读取App.config文件的appSettings节的方法比较简单,可以通过上文中 System.Configuration.ConfigurationManager.AppSettings["Key"]的方法进行访问,但该方法不提供写入。

如果希望写入配置文件,可以使用ConfigurationManager对象执行打开配置文件的操作后,将会返回一个Configuration的对象,利用该对象进行操作(增删改查都可以哦)。

下面给出实现的代码(增加引用using System.Configuration名称空间)

//获取Configuration对象
Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//根据Key读取<add>元素的Value
string name = config.AppSettings.Settings["name"].Value;
//写入<add>元素的Value
config.AppSettings.Settings["name"].Value = "cnblogs";
//增加<add>元素
config.AppSettings.Settings.Add("url", "http://www.cnblogs.com");
//删除<add>元素
config.AppSettings.Settings.Remove("name");
//一定要记得保存,写不带参数的config.Save()也可以
config.Save(ConfigurationSaveMode.Modified);
//刷新,否则程序读取的还是之前的值(可能已装入内存)
System.Configuration.ConfigurationManager.RefreshSection("appSettings");

需要注意的是:

1、根据并不存在的Key值访问<add>元素,甚至使用remove()方法删除不存在的元素,都不会导致异常,前者会返回null。

2、add已经存在的<add>元素也不会导致异常,而是concat了已有的Value和新的Value,用","分隔,例如:"olldvalue,newvalue"。

3、在项目进行编译后,在运行目录bin\Debuge文件下,将出现两个配置文件,一个名为“ProjectName.EXE.config”,另一个名为“ProjectName.vshost.exe.config”。第一个文件为项目实际使用的配置文件,在程序运行中所做的更改都将被保存于此;第二个文件其实为原代码中“App.config”的同步文件,在程序运行中不会发生更改。

4、特别注意大小写(XML文件是区分大小写的),例如appSettings配置节。

5、可能有读者会想到,既然app.config是标准XML,当然也可以用操纵一般XML文件的方法来读写。这当然是可以的!具体可以看文末参考文献[2]和[3]中的代码,只不过我认为这样就失去了VS提供app.config文件的意义了,还不如自己定义一个配置文件方便。

本文只是粗略地讲了app.config文件中appSettings配置节的访问方法,connectionStrings配置节的操作基本是类似的,也可以自定义配置节。这些高级的用法可以自己体会,VS对app.config这个配置文件的管理还是很强大的,例如WinForm应用程序的Settings设置(可以在IDE中或者通过代码访问)其实也是利用了app.config文件。

 
参考

[1]C# winform 自定义应用程序配置文件(app.config)

[2]C#读写App.config配置文件的方法

[3]在.net中读写config文件的各种方法 (文章内容挺多的,还没仔细看)

C#应用程序配置文件.config介绍的更多相关文章

  1. .NET 多个程序配置文件合并到主app.config

    .NET 多个程序配置文件合并到主app.config

  2. C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作

    原文 http://www.cnblogs.com/codealone/archive/2013/09/22/3332607.html 应用程序配置文件,对于asp.net是 web.config,对 ...

  3. C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作,无法为请求的 Configuration 对象创建配置文件。

    应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本 ...

  4. C# 应用程序配置文件App.Config和web.config

    应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本 ...

  5. 微信小程序-04-详解介绍.json 配置文件

    致我自己:小程序开发不是简单一两天的事,一两天只能算是了解,有时候看多了会烦,感觉很熟悉了,其实只是对表面进行了解,对编程却知之甚少,小程序开发不是简单的改模板,一两天很多部分改模板可能都做不到,坚持 ...

  6. Config程序配置文件(configSections)操作实践及代码详注

    所有与配置文件相关的类:(粗体为一般情况下使用到的类,其它类功能可能在很复杂的情况下才使用到.) 1.ConfigurationManager,这个提供用于打开客户端应用程序集的Configurati ...

  7. C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法

    c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...

  8. MySQL Cluster 配置文件(config.ini)详解

    MySQL Cluster 配置文件(config.ini)详解 ################################################################### ...

  9. C# 应用程序配置文件操作

    应用程序配置文件,对于asp.net是 web.config对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本质 ...

随机推荐

  1. [python学习篇][书籍学习][python standrad library][内建函数]之[list,open,len,pow,range,

    Python 解释器内置了一些函数,它们总是可用的.这里将它们按字母表顺序列出.     Built-in Functions     abs() divmod() input() open() st ...

  2. 51nod 1010 只包含因子2 3 5的数 二分答案

    1010 只包含因子2 3 5的数 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 > ...

  3. HDU - 1705 Count the grid

    昨天吉老师讲了皮克定理 皮克定理用于计算点阵中顶点在格点上的多边形面积.对于一个顶点全部在格点上的多边形来说,它的面积计算有如下特点: 如果用a表示位于多边形内部的格点数,b表示位于多边形边界上的格点 ...

  4. 【转】学习设计模式之前你必须掌握的-看懂UML类图

    UML类图是UML(unified modeling language,标准建模语言)五种图示法中静态图的一种-用来描述系统中类的静态结构,不仅定义系统中的类,表示类之间的联系如关联.依赖.聚合等,也 ...

  5. JDBC 学习笔记(五)—— Statement

    JDBC 使用 Statement 作为 SQL 语句的执行器. Statement 通过 Connection.createStatement() 方法创建,一共支持以下6种方式执行 SQL 语句: ...

  6. background-position-x和background-position-y的兼容性问题

    一.语法: background-position-x : length | left | center | right background-position-y : length | left | ...

  7. eclipse中纯java配置log4j日志

    1.新建java项目log4Test 2.新建目录lib,把log4j-1.2.9.jar包放入lib目录 3.右键工程,选择Properties->Java Build Path->Li ...

  8. jenkins发送html测试报告

    jenkins发送html测试报告  https://blog.csdn.net/galen2016/article/details/77975965/ <!DOCTYPE html> & ...

  9. 【python接口自动化】httpUtils

    # coding=utf8 import requests from common.logger import Logger import logging class httpUtils: logge ...

  10. 解决v-for产生的警告的办法

    当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略.如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且 ...