简单的配置信息,可以直接放入 标记中。如:
<appSettings>
<add key="LogFile" value="d:/log/debug.log"/>
appSettings>
configuration>
相应访问代码如下:
2. 自定义配置节(section)名称
比如,我们要使用下面的配置结构,将配置信息归类分组:
<configuration>
<myConfig>
<myDictionary>
<add key="Area" value="Fuzhou"/>
<add key="Device" value="Printer"/>
<add key="Customer" value="Muf"/>
myDictionary>
<myNameValue>
<add key="Area" value="Fuzhou"/>
<add key="Device" value="Printer"/>
<add key="Customer" value="Muf"/>
myNameValue>
<myInfo
Area="Fuzhou" Device="Printer" Customer="Muf"
/>
myConfig>
configuration>
但是光这样子说明是不行的。没有声明,是不能使用自定义的配置段。我们必须要在配置文件前面加入声明:
< configSections >
< sectionGroup name ="myConfig" >
< section name ="myDictionary"
type ="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
< section name ="myNameValue"
type ="System.Configuration.DictionarySectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
< section name ="myInfo"
type ="System.Configuration.SingleTagSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
sectionGroup>
configSections>
声明和配置的关系,示意图如下:
由图上可以看出,NameValueSectionHandler和DictionarySectionHandler在定义配置文件的内容形式上是一样的,都是用
来设置内容的。只是返回到C#中的类不太一样,可以参考下面的代码示例。
另外,如果不关心Handler类的版本等信息,可以直接省略。如NameValueSectionHandler可以直接如下声明:
把上面的 声明段放入配置文件中,我们的配置结构就可以正常使用了。声明中,< sectionGroup>用来定义不含配置数据的节的名称。
用来定义含有自定义配置数据的节的名称。< section type> 用来指定定义配置数据的类型。注意,自定义的配置节,不能使用 System.Configuration.ConfigurationSettings.AppSettings.Get 来访问,要使用 System.Configuration.ConfigurationSettings. GetConfig。
.NET已经定义了3种配置类型:
a. NameValueSectionHandler
相应访问代码如下:
string Area = myNameValue[ " Area " ];
string Device = myNameValue[ " Device " ];
string Customer = myNameValue[ " Customer " ];
b. DictionarySectionHandler
相应访问代码如下:
string Area = myNameValue[ " Area " ];
string Device = myNameValue[ " Device " ];
string Customer = myNameValue[ " Customer " ];
c. SingleTagSectionHandler
相应访问代码如下:
string Area = myNameValue[ " Area " ];
string Device = myNameValue[ " Device " ];
string Customer = myNameValue[ " Customer " ];
这三种类型的详细信息,可以参考 MSDN 文档。同时.NET 还定义了IgnoreSectionHandler类型,为 System.Configuration 之外的系统所读取和处理的配置节提供节处理程序定义。
除此之外,.NET提供了IConfigurationSectionHandler接口,这样我们还可以自行进行扩展,以设计出我们自已的配置形式。
3. 自定义配置结构 (使用IConfigurationSectionHandler)
假设有以下的配置信息,其在MyInfo可以重复许多次,那么应如何读取配置呢?这时就要使用自定义的配置程序了。
< myInfo Area ="Fuzhou" Device ="Printer" Customer ="Muf" />
< myInfo Area ="Shanghai" Device ="Mobile" Customer ="Liny" />
</ myConfig >
访问代码如下:
Debug.Assert( cfgTable.Count == 2 );
Hashtable cfgFuzhou = (Hashtable)cfgTable[ " Fuzhou " ];
Hashtable cfgShanghai = (Hashtable)cfgTable[ " Shanghai " ];
Debug.Assert( cfgFuzhou[ " Device " ] == " Printer " );
Debug.Assert( cfgShanghai[ " Device " ] == " Mobile " );
Debug.Assert( cfgFuzhou[ " Customer " ] == " Muf " );
Debug.Assert( cfgShanghai[ " Customer " ] == " Liny " );
foreach (Hashtable cfg in cfgTable.Values)
{
Console.WriteLine("Area={0} Device={1} Customer={2}", cfg["Area"], cfg["Device"], cfg["Customer"]);
![](http://ly4cn.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
为了能使用上面的访问代码来访问配置结构,我们需要生成一个特定的配置读取类(configurationsectionhandler),例子很简单,就不多做说明了:
{
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
Hashtable config = new Hashtable();
foreach(XmlNode node in section.ChildNodes)
{
if(node.Name != "myInfo")
throw new System.Configuration.ConfigurationException("不可识别的配置项", node);
Hashtable item = new Hashtable();
foreach(XmlAttribute attr in node.Attributes)
{
switch(attr.Name)
{
case "Area":
case "Device":
case "Customer":
item.Add(attr.Name, attr.Value);
break;
default:
throw new System.Configuration.ConfigurationException("不可识别的配置属性", attr);
![](http://ly4cn.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://ly4cn.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
config.Add(item["Area"], item);
![](http://ly4cn.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
return config;
![](http://ly4cn.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://ly4cn.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
然后,我们再定义配置说明。其中,mynamespace.myinfosectionhandler 是MyInfoSectionHandler类的带名字空间的完整名称;myApp 则是定义MyInfoSectionHandler类的程序集不带扩展名的名字(如myApp.dll或myApp.exe):
< configuration >
<!-- 以下是自定义配置的声明 -->
< configSections >
< section name ="myConfig" type ="myNamespace.MyInfoSectionHandler, myApp" />
</ configSections >
< myConfigs >
< myInfo Area ="Fuzhou" Device ="Printer" Customer ="Muf" />
< myInfo Area ="Shanghai" Device ="Mobile" Customer ="Liny" />
</ myConfig >
</ configuration >
1. 配置文件概述:
应 用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是 configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大 概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。
常见配置文件模式:
<configuration>
<configSections> //配置节声明区域,包含配置节和命名空间声明
<section> //配置节声明
<sectionGroup> //定义配置节组
<section> //配置节组中的配置节声明
<appSettings> //预定义配置节
<Custom element for configuration section> //配置节设置区域
2. 只有appSettings节的配置文件及访问方法
下面是一个最常见的应用程序配置文件的例子,只有appSettings节。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="connectionstring" value="User ID=sa;Data Source=.;Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" />
<add key="TemplatePATH" value="Template" />
</appSettings>
</configuration>
下面来看看这样的配置文件如何方法。
string _connectionString=ConfigurationSettings.AppSettings["connectionstring"];
使用ConfigurationSettings类的静态属性AppSettings就可以直接方法配置文件中的配置信息。这个属性的类型是NameValueCollection。
3. 自定义配置文件
3.1 自定义配置节
一个用户自定义的配置节,在配置文件中分为两部分:一是在<configSections></ configSections>配置节中声明配置节(上面配置文件模式中的“<section>”),另外是 在<configSections></ configSections >之后设置配置节(上面配置文件模式中的“<Custom element for configuration section>”),有点类似一个变量先声明,后使用一样。声明一个配置文件的语句如下:
<section name=" " type=" "/>
<section>:声明新配置节,即可创建新配置节?/P>
name:自定义配置节的名称。
type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、 System.Configuration.DictionarySectionHandler、 System.Configuration.NameValueSectionHandler。
不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>
<section name="Test2" type="System.Configuration.DictionarySectionHandler"/>
<section name="Test3" type="System.Configuration.NameValueSectionHandler" />
</configSections>
<Test1 setting1="Hello" setting2="World"/>
<Test2>
<add key="Hello" value="World" />
</Test2>
<Test3>
<add key="Hello" value="World" />
</Test3>
</configuration>
我们对上面的自定义配置节进行说明。在声明部分使用<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>声明了一个配置节它的名字叫 Test1,类型为SingleTagSectionHandler。在设置配置节部分使用 <Test1 setting1="Hello" setting2="World"/>设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配 置节和这个类似。
下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。
public static object GetConfig(string sectionName);
下面是访问这三个配置节的代码:
//访问配置节Test1
IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig("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,0);
MessageBox.Show(values1[0]+" "+values1[1]); //输出Hello World
//访问配置节Test2
IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig("Test2");
string[] keys=new string[IDTest2.Keys.Count];
string[] values=new string[IDTest2.Keys.Count];
IDTest2.Keys.CopyTo(keys,0);
IDTest2.Values.CopyTo(values,0);
MessageBox.Show(keys[0]+" "+values[0]);
//访问配置节Test3
NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");
MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]); //输出Hello World
通过上面的代码我们可以看出,不同的type通过GetConfig返回的类型不同,具体获得配置内容的方式也不一样。 配置节处理程序
返回类型
SingleTagSectionHandler
Systems.Collections.IDictionary
DictionarySectionHandler
Systems.Collections.IDictionary
NameValueSectionHandler
Systems.Collections.Specialized.NameValueCollection
3.2 自定义配置节组
配置节组是使用<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)ConfigurationSettings.GetConfig("TestGroup/Test");
MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]); //输出Hello World