关于C#:app.config-自定义节不工作


App.config - custom section not working

我最近开始构建Web应用程序的控制台版本。我从web.config中复制了自定义分区。到我的app.config。当我转到获取配置信息时,我会收到此错误:

为x/y创建配置节处理程序时出错:无法从程序集"system.configuration"加载类型"x"。

它不喜欢的线条是:

将configurationmanager.getsection("x/y")返回为z;

有人碰到这样的东西吗?

我可以补充

1
 

在AppSettings中读取。

添加:

我确实对自定义部分进行了定义:

1
2
3
4
5
6
  <configSections>
    <sectionGroup name="x">
      <section name="y" type="zzzzz"/>
    </sectionGroup>

  </configSections>

我最近也有同样的问题。我为一个Web应用程序创建了一个自定义的sectiongroup(运行得很好),但是当我将这个层移植到一个控制台应用程序时,sectiongroup失败了。

在您的问题中,关于您的部分定义中需要多少"类型"是正确的。我用下面的示例修改了您的配置部分:

1
2
3
4
5
6
7
<configSection>
    <section
        name="yourClassName"
        type="your.namespace.className, your.assembly"
        allowLocation="true"
        allowDefinition="Everywhere" />
</configSection>

您会注意到,类型现在有类名和程序集名。这是在Web环境之外进行交互所必需的。

注意:程序集名称不一定等于您的命名空间(对于给定的节)。


听起来您的配置节处理程序没有定义

1
2
3
4
5
6
7
8
<configSection>
    <section
            name="YOUR_CLASS_NAME_HERE"
            type="YOUR.NAMESPACE.CLASSNAME, YOUR.NAMESPACE, Version=1.1.0.0, Culture=neutral, PublicKeyToken=PUBLIC_TOKEN_ID_FROM_ASSEMBLY"
            allowLocation="true"
            allowDefinition="Everywhere"
          />
</configSection>


此类用作任何类型的常规自定义配置节处理程序…

1
2
3
4
5
6
7
8
9
10
public class XmlConfigurator : IConfigurationSectionHandler
    {
        public object Create(object parent, object configContext, XmlNode section)
        {
            if (section == null) return null;
            Type sectionType = Type.GetType((string)(section.CreateNavigator()).Evaluate("string(@configType)"));
            XmlSerializer xs = new XmlSerializer(sectionType);
            return xs.Deserialize(new XmlNodeReader(section));
        }
    }

在app.config中,添加

1
  <section name="NameofConfigSection"  type="NameSpace.XmlConfigurator, NameSpace.Assembly"/>

在configuration部分元素中,添加一个属性来指定要将根元素反序列化为的类型。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8" ?>

<NameofConfigSection configType="NameSpace.NameofTypeToDeserializeInto, Namespace.Assembly">

 ...

</NameofConfigSection>


在文件的顶部,您需要在节内具有configSection标记。

您也可以使用sectiongroup。例子:

1
2
3
4
5
6
7
<configuration>
   <configSections>
     <sectionGroup name="x">
       <section name="y" type="a, b"/>
     </sectionGroup>
    <configSections>
</configuration>

如果需要自定义配置处理程序,则必须定义类并引用它,如StevenLowe所示。您可以从预定义的处理程序继承,也可以只使用AppSetting部分中提供的值/键对,如您所指出的。