The bolded section represents a new part of the configuration file that could be called “configuring the configuration。” Any XML node that is within the section is used to customize the configuration…parsing infrastructure。 In the example; the XML node has two attributes that refer to what the configuration infrastructure should do when it encounters a specific XML node。 The attribute name specifies the name of the XML node; and the attribute type references a type (Definitions。LoaderSection) and assembly (Definitions) that will process the XML node。 Step back and think about what is happening here。 The XML node is used to configure the configuration processor using dynamically loaded types。 This demonstrates that the process of dynamically loading and executing pieces of code is not rocket science; but a daily part of developing ponents in 。 Marshaling the Configuration File Data When you want to use a custom node in a configuration file; you need to implement a class that subclasses System。Configuration。ConfigurationSection。 The purpose of the custom class is to process and structure the data in the configuration file into something that the application can manipulate。 In other words; we are marshaling the data from the configuration file to the environment。 Here’s the start of our class; which belongs in the Definitions assembly: Public Class LoaderSection Inherits ConfigurationSection …………………………………………………………Page 350…………………………………………………………… 328 CH AP T E R 1 2 ■ L E A R N I N G A B OU T A PP L I CA TI O N CO N F I G U R AT IO N AN D D Y N A M I C L O AD I N G The infrastructure helps you implement the marshaling routines by providing class types that allow you to explicitly associate an XML attribute or keyword with some variable。 For example; suppose you want to cross…reference the XML attribute easyname with a type。 To do so; first define the nature and type of the property using the type ConfigurationProperty (this code goes in the LoaderSection class): Dim _propEasyName As ConfigurationProperty = _ New ConfigurationProperty(〃easyname〃; GetType(String); Nothing; _ ConfigurationPropertyOptions。IsRequired) This example uses the ConfigurationProperty constructor that has four parameters: o 〃easyname〃: Identifies the XML attribute identifier that will be used。 o GetType(String): Identifies the type of the attribute; which could also include Double and Integer to indicate a number。 o Nothing: Identifies the default value of the attribute if the attribute is not present in the XML configuration file。 o ConfigurationPropertyOptions。IsRequired: Identifies some characteristics of the attribute; in the case of this example; the attribute is required。 ■Note There are multiple constructors for ConfigurationProperty。 For more information; check out the MSDN documentation (http://msdn2。microsoft。/en…us/library/system。configuration。 configurationproperty。configurationproperty。aspx)。 Once you have defined a property; you need to cross…reference it with a property and the base class ConfigurationSection (again; this code goes in the LoaderSection class): _ Public ReadOnly Property EasyName() As String Get Return CStr(MyBase。Item(_propEasyName)) End Get End Property Whenever you reference the property EasyName; the attributes associated with the property provide a cross…reference with the configuration file。 Whenever the property is called; the base indexer with data member that references ConfigurationProperty is called and marshals the data from the configuration file to the type。 The plete implementation used to process the XML node is as follows (added to the Definitions assembly): …………………………………………………………Page 351…………………………………………………………… CH AP T E R 1 2 ■ L E AR N IN G AB O U T AP P L I CAT I ON CO N F IG U R AT IO N A N D D Y N A M IC L O AD IN G 329 Imports System。Configuration Public Class LoaderSection Inherits ConfigurationSection Private Shared _propAssemblyName As ConfigurationProperty = _ New ConfigurationProperty(〃assemblyname〃; GetType(String); Nothing; _ ConfigurationPropertyOptions。IsRequired) Private Shared _propEasyName As ConfigurationProperty = _ New ConfigurationProperty(〃easyname〃; GetType(String); Nothing; _ ConfigurationPropertyOptions。IsRequired) Private Shared _properties As ConfigurationPropertyCollection = _ New ConfigurationPropertyCollection() Private Shared _propTypeName As ConfigurationProperty = _ New ConfigurationProperty(〃typename〃; GetType(String); Nothing; _ ConfigurationPropertyOptions。IsRequired) Shared Sub New() _properties。Add(_propAssemblyName) _properties。