C# 阅读配置部分

C# 阅读配置部分,c#,service,config,app-config,C#,Service,Config,App Config,我正在编写一个Windows服务,它需要app.config中的一些信息-我知道我可以使用AppSettings,但我正试图更好地理解配置部分 我已经修改了我的App.Config: <configuration> <startup> <supportedRuntime sku=".NETFramework,Version=v4.0" version="v4.0"/> </startup>

我正在编写一个Windows服务,它需要app.config中的一些信息-我知道我可以使用
AppSettings
,但我正试图更好地理解配置部分

我已经修改了我的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 MyConfigurationSection ConfigSection
{
    get
    {
        var configurationSection = Configuration.GetSection("config");
        return (MyConfigurationSection) configurationSection;
    }
}

private static Configuration Configuration
{
    get { return ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); }
}
        Console.WriteLine("Number: " + MyConfigurationSection.Current.Number);
        Console.WriteLine("Boolean: " + MyConfigurationSection.Current.Boolean);
        Console.ReadLine();
在我进入
(MyConfigurationSection)配置部分之前,一切正常。调用
GetSection()
,我将返回一个
DefaultSection
,但强制转换失败


我哪里迷路了?

可能,虽然没有检查

type="MyNamespace.MyConfigurationSection"/>
应该是

type="<Namespace.ClassName>,<Namespace>"/>
type=“,”/>

可能,尽管没有检查

type="MyNamespace.MyConfigurationSection"/>
应该是

type="<Namespace.ClassName>,<Namespace>"/>
type=“,”/>

config是一个保留字,不能用作配置节的名称。您也不应该将变量命名为布尔值

请尝试以下示例:

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>

config是保留字,不能用作配置节的名称。您也不应该将变量命名为布尔值

请尝试以下示例:

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>

这里的问题是,您必须在app.config中的节配置中将类型值用作“Namespace.ClassName,Namespace”,更重要的是,configSections必须是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>

这里的关键是,您必须在app.config中的节配置中将类型值用作“Namespace.ClassName,Namespace”,更重要的是,configSections必须是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>


难道你想不出一个比“config”更好的名称来命名configsection吗?这是一个模型。我也不是真的用“aBoolean”和“aNumber”。你能想出一个比“config”更好的名称吗?这是一个模型。我也不是真的用“aBoolean”和“aNumber”,这两点你都是对的。重新安排了内容并更改了“type”属性,它就像一个符咒。干得好,伙计。你在两个方面都是对的。重新安排了内容并更改了“type”属性,它就像一个符咒。干得好,伙计。这是问题的一部分,但我还需要按照标记的答案重新排列app.config。这是问题的一部分,但我还需要按照标记的答案重新排列app.config。