2016-12-07 8 views
0

Я пишу службу Windows, которая нуждается в некоторой информации из app.config. Я знаю, что могу использовать AppSettings, но я пытаюсь понять разделы конфигурации немного лучше.Чтение конфигурацииSection

Я изменил мой App.config:

<configuration> 
    <startup> 
    <supportedRuntime sku=".NETFramework,Version=v4.0" 
         version="v4.0"/> 
    </startup> 

    <configSections> 
    <section name="config" 
      type="MyNamespace.MyConfigurationSection"/> 
    </configSections> 

    <config aNumber="1" 
      aBoolean="false"/> 

</configuration> 

и создал следующий класс:

public sealed class MyConfigurationSection : ConfigurationSection 
{ 
    [ConfigurationProperty("aNumber", DefaultValue = 1, IsRequired = false)] 
    public int Number 
    { 
     get { return (int) this["aNumber"]; } 
     set { this["aNumber"] = value; } 
    } 

    [ConfigurationProperty("aBoolean", DefaultValue = false, IsRequired = false)] 
    public bool Boolean 
    { 
     get { return (bool) this["aBoolean"]; } 
     set { this["aBoolean"] = value; } 
    } 
} 

, и я пытаюсь получить доступ к нему, как это:

public MyConfigurationSection ConfigSection 
{ 
    get 
    { 
     var configurationSection = Configuration.GetSection("config"); 
     return (MyConfigurationSection) configurationSection; 
    } 
} 

private static Configuration Configuration 
{ 
    get { return ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); } 
} 

Все работает нормально, пока не доберусь до . Я возвращаю DefaultSection от моего звонка до GetSection(), и листинг терпит неудачу.

Где я сбился с пути?

+0

не мог бы вы придумать лучшее название для configsection, чем «конфигурация» – Daniel

+0

Это макет. Я тоже не использую «aBoolean» и «aNumber». –

ответ

1

Загвоздка здесь есть, у вас есть использовать значение типа как «Namespace.ClassName, Namespace» в конфигурации раздела в app.config и, что более важно, configS отражения должны быть первым дочерним элемент элемента конфигурации корневой в вашем app.config

Ниже конфигурация может работать для вас:

<configuration> 
     <!-- <configSections> is moved to first child of <configuration> --> 
     <configSections> 
     <section name="config" 
       type="MyNamespace.MyConfigurationSection, MyNamespace"/> 
     </configSections> 

     <config aNumber="1" 
       aBoolean="false"/> 

     <startup> 
     <supportedRuntime sku=".NETFramework,Version=v4.0" 
          version="v4.0"/> 
     </startup> 
</configuration> 
+0

Вы были правы в обоих точках. Перестроенные вещи * и * изменили атрибут «type», и он работает как шарм. Молодец, приятель. –

1

Возможно, хотя не проверял,

type="MyNamespace.MyConfigurationSection"/> 

Должно быть

type="<Namespace.ClassName>,<Namespace>"/> 
+0

Это было частью проблемы, но мне также нужно было изменить порядок app.config, как в отмеченном ответе. –

0

конфигурации является зарезервированным словом и не может быть использовано для названия раздела конфигурации. Вы также не должны указывать переменную Boolean.

Попробуйте следующий пример:

using System.Configuration; 

namespace ConfigSectionSample 
{ 
    internal class MyConfigurationSection : ConfigurationSection 
    { 
     public static MyConfigurationSection Current 
     { 
      get 
      { 
       return (MyConfigurationSection)ConfigurationManager.GetSection("myConfig"); 
      } 
     } 

     [ConfigurationProperty("aNumber", IsRequired = true)] 
     public int Number 
     { 
      get 
      { 
       return (int)this["aNumber"]; 
      } 
     } 

     [ConfigurationProperty("aBoolean", IsRequired = true)] 
     public bool Boolean 
     { 
      get 
      { 
       return (bool)this["aBoolean"]; 
      } 
     } 
    } 
} 

Со следующим приложением, конфигурации

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="myConfig" type="ConfigSectionSample.MyConfigurationSection, ConfigSectionSample"></section> 
    </configSections> 

    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 

    <myConfig aNumber="1" aBoolean="false" /> 
</configuration> 

И получить значения, как это:

 Console.WriteLine("Number: " + MyConfigurationSection.Current.Number); 
     Console.WriteLine("Boolean: " + MyConfigurationSection.Current.Boolean); 
     Console.ReadLine();