2016-12-07 2 views
0

Je suis en train d'écrire un service Windows qui a besoin d'informations à partir de app.config - je sais que je pourrais utiliser AppSettings, mais j'essaie de comprendre un peu mieux les sections de configuration.Lire une ConfigurationSection

J'ai modifié mon 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> 

et créé la classe suivante:

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; } 
    } 
} 

et je suis en train d'y accéder comme ceci:

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

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

Tout fonctionne bien jusqu'à ce que j'arrive à la distribution . Je reçois un DefaultSection de mon appel à GetSection() et la distribution échoue.

Où est-ce que je me suis égaré?

+0

ne pouvait pas vous imaginer un meilleur nom pour le configsection que « config » – Daniel

+0

Ceci est une maquette. Je n'utilise pas vraiment "aBoolean" et "aNumber", non plus. –

Répondre

1

Le hic ici est, vous avez utiliser la valeur de type "Namespace.ClassName, Namespace" dans la section configuration dans app.config et plus important encore les configS exions doit être le premier enfant de l'élément de configuration racine dans votre app.config

Ci-dessous la configuration pourrait fonctionner pour vous:

<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

Vous aviez raison sur les deux points. Les choses réorganisées * et * ont changé l'attribut 'type' et cela fonctionne comme un charme. Bien joué, mec. –

1

Peut-être, mais n'a pas vérifié,

type="MyNamespace.MyConfigurationSection"/> 

Devrait être

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

Cela faisait partie du problème, mais j'avais aussi besoin de réorganiser le app.config comme dans la réponse marquée. –

0

config est un mot réservé et ne peut pas être utilisé pour le nom d'une section de configuration. Vous ne devriez pas non plus nommer une variable Boolean.

Essayez cet exemple suivant:

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"]; 
      } 
     } 
    } 
} 

Avec l'application suivante, config

<?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> 

Et obtenir les valeurs comme ceci:

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