通天峰40层怎么打:应用程序配置和动态加载7

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 16:54:29

自定义应用程序配置

为了让自己编写的程序更加具有灵活性,往往需要把一些信息放置到程序的外部,等到程序运行时,根据读入的数据的不同,可能让程序具有不同的表现。存放这些信息的文件就称为应用程序的配置文件,有的人将配置信息写入ini的文件中,有的应用程序把这些信息写入数据库。在.Net中,一般采用标准的XML文件作为配置文件。不同的应用程序配置文件的名称不同。在.Net中web程序的配置文件一般叫web.config,应用程序的配置文件一般叫app.config。

由于配置文件就是一个XML文件所以称文件中的每一个结点为元素。每个XML中的元素都对应一个配置信息,所以又称元素在配置信息中为配置元素,如果一个配置元素中还包含其他的配置元素,那么就称这个配置元素为配置节。

下面具体看一个.Net中具体使用的配置文件,观察一下配置文件的格式。为了能让大家看清楚配置文件的组成,对文中的一些内容进行了省略,用“…”来表示。

       

                            

                                                                  

                        

       

       

              

              

       

       

              

       

从上面可以看出,一个配置文件具有根元素configuration,与命名空间System.Configuration中的类Configuration相对应。在根元素configuration中包含的内容一般分为两个部分。第一部分位于configSections中,称为配置节的声明部分。剩下的部分就称为配置节区域,里面包含有很多的配置信息,每一个配置信息,称为一个配置元素或者配置节,配置节还可以包含配置节。像上面文件中

       

              

              

       

就是一个配置元素。相对应的connectionStrings是另外的一个配置元素。在配置文件中配置区域的每一个配置元素或者配置节都需要在configSections先声明,然后在后面的配置信息中才能使用。否则,程序会提示“不能识别的配置元素”的提示。这个就像编程中使用的变量首先要声明一样。

在配置节的声明部分,比如中,name就表示下面将要使用到的配置节的名称。type就表示对这个配置信息的处理程序,如果使用的程序集是私有程序集时 type通常由两部分组成,由逗号“,”分隔,前半部分是类型名称,后半部分是程序集名称。如果是公有程序集(),则需要提供publicKey。比如一个使用了强命名程序集的完整声明为:

configSections与.NET Framework中的configSections元素相对应,在configSections元素中可以包含在表11-5中列出的子元素。

元素的名称

说明

clear

移除对继承的节和节组的所有引用

remove

移除对继承的节和节组的引用

section

定义配置节处理程序与配置元素之间的关联

sectionGroup

定义配置节处理程序与配置节之间的关联

如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素。

在配置文件中的配置节在System.Configuration命名空间中有相应的类与之对应,这样做的目的是提供对这些节的操作,configuration与类Configuration相对应,配置节对应的类使用ConfigurationSection类来表示。可以使用该类提供的GetSection或者GetSectionGroup方法来读取配置文件中的信息。而ConfigurationManager类封装了对这些配置节的操作,并且该类还具有两个属性,AppSettings与ConnectionStrings,这两个属性分别与配置文件中的appSettings与connectionStrings配置节相对应,appSettings返回一个NameValueCollection类,而connectionStrings返回一个ConnectionStringSettingsCollection类。根据上面讲解的知识,不但能够读取.NET Framework中已经定义好的内置结点的信息,也可以自定义结点。

11.4.1使用.Net内置结点和.Net内置处理程序

在目录InElementAndMethod中添加一个控制台应用程序InElementAndMethod,在该应用程序中,添加一个配置文件,然后将配置文件中的信息打印出来。

配置文件的内容:

  

  

    

    

    

  

在main函数中读取这些信息,并打印出来。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Configuration;//手工添加

 

 

namespace InElementAndMethod

{

    class Program

    {

        static void Main(string[] args)

        {

            string Name = ConfigurationManager.AppSettings["Name"];

            string Language = ConfigurationManager.AppSettings["Language"];

            string Version = ConfigurationManager.AppSettings["Version"];

            Console.WriteLine("名称:{0},版本:{1},语言:{2}", Name, Version, Language);

            Console.ReadKey();

 

        }

    }

}

由于控制台应用程序并不包含System.Configuration.dll程序集,所以如果要使用ConfigurationManager类,必须首先在项目中添加该引用。

程序的运行结果为:名称:TraceFact.Net,版本:v1.0.08040301,语言:Chinese

大家在配置文件App.config中并没有看到configSections 配置节声明部分,而是直接包含了appSettings配置节,依然能使用appSettings配置节,并没有出现“未识别的配置元素”的异常,那么现在在配置文件中再添加一个自己定义的配置节。看一下会出现什么样的问题。

新添加的配置节

    

    

重新编译程序,会看到图11-24的信息

图11-24

运行程序会出现图11-25的异常

图11-25

为什么appSettings配置节都没有问题,而VS2008就不行呢?这是因为appSettings是系统内部定义的结点,在系统内有一个文件machine.config,该文件主要设置一些具有具有全局方面的设置,以提供全局服务。该文件一般在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG目录中,打开该文件,可以看到图11-26所示的信息。

图11-26

虽然在程序InElementAndMethod的配置文件中没有明确的声明appSettings配置节,没有指定它在.NET中的处理程序,但是在machine.config中已经提前声明了,所以在程序中能直接使用。能不能仿照appSettings配置节的声明,在自己的程序中也声明一下,是不是自己定义的配置节也就能够使用了呢?

将machine.config文件中关于appSettings配置节的声明部分,拷贝到App.config文件中。将name改为“VS2008”,然后在main函数中输入下列内容。

 string Year = ConfigurationManager.GetSection("Year").ToString();

string Company = ConfigurationManager. .GetSection("Company") ToString();

仍然不能运行,原因在什么地方呢?

11.4.2使用自定义结点和.Net内置处理程序

上面示例中,自己写了一个VS2008的配置节结点,然后仿照appSettings配置节的声明部分,在应用程序的配置文件也进行了声明,可是依然不能使用,原因在于声明部分的type指出的类型上面。VS2008声明的类型是System.Configuration.AppSettingsSection,这个数据集是为appSettings配置节专门编写的处理程序。所以在VS2008配置节中不能使用,现在需要提供自己的处理VS2008配置节的处理程序。

在.Net中已经提供了3个处理配置节的处理程序,它们是System.Configuration.SingleTagSectionHandler、   System.Configuration.DictionarySectionHandler、 System.Configuration.NameValueSectionHandler。

 

System.Configuration.SingleTagSectionHandler,只能够处理形如

这样的标签。

System.Configuration.NameValueSectionHandler就能够处理

    

    

这样的配置节,其实ConfigurationManager.AppSettings 返回的就是一个NameValueCollection类(表示可通过键或索引访问的关联String类型的键和String类型的值的集合,在命名空间System.Collections.Specialized)。为了演示这两种处理程序,修改App.config,如下:

  

     

    

    

  

  

    

    

    

   

  

  

    

    

  

  

读取配置文件信息的完整的代码如下:

using System;

using System.Collections;

using System.Linq;

using System.Text;

using System.Configuration;//手工添加,用到ConfigurationManager

using System.Collections.Specialized;//手工添加,用到NameValueCollection

 

namespace InElementAndMethod

{

    class Program

    {

        static void Main(string[] args)

        {

            string Name = ConfigurationManager.AppSettings["Name"];

            string Language = ConfigurationManager.AppSettings["Language"];

            string Version = ConfigurationManager.AppSettings["Version"];

            Console.WriteLine("名称:{0},版本:{1},语言:{2}", Name, Version, Language);

            //采用SingleTagSectionHandler处理程序,得到哈希表

            Console.WriteLine("采用SingleTagSectionHandler处理程序.");

            Hashtable VS2008_1 =(Hashtable)ConfigurationManager.GetSection("VS2008_1");           

            Console.WriteLine("Year:{0},Company:{1}", (string)VS2008_1["Year"], (string)VS2008_1["Company"]);

            Console.WriteLine("采用NameValueSectionHandler处理程序.");

            //采用NameValueSectionHandler处理程序,得到NameValueCollection

            NameValueCollection VS2008_2 = (NameValueCollection)ConfigurationManager.GetSection("VS2008_2");           

            foreach (string key in VS2008_2.Keys)

            {

                Console.WriteLine("{0}={1}", key, VS2008_2[key]);

            }

            Console.ReadKey();

        }

    }

}

运行程序,结果是:

名称:TraceFact.Net,版本:v1.0.08040301,语言:Chinese

采用SingleTagSectionHandler处理程序.

Year:2008,Company:MicroSoft

采用NameValueSectionHandler处理程序.

Year=2008

Company=MicroSoft