Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ConfigurationManager.GetSection不';t返回自定义部分_C#_Configuration_Configurationmanager - Fatal编程技术网

C# ConfigurationManager.GetSection不';t返回自定义部分

C# ConfigurationManager.GetSection不';t返回自定义部分,c#,configuration,configurationmanager,C#,Configuration,Configurationmanager,因为我的新项目有一个复杂的配置结构,所以我正在学习如何将类ConfigurationManager用于自定义配置 为此,我举了一个例子。此示例显示了聚合其他可配置类的类的配置部分 MyProblem:ConfigurationManager.GetSection不返回节 我创建了一个控制台应用程序 命名空间:TryConfigManagement 添加参考:System.Configuration 更改了App.Config(始终复制),如下所示: <?xml version="1.0"

因为我的新项目有一个复杂的配置结构,所以我正在学习如何将类ConfigurationManager用于自定义配置

为此,我举了一个例子。此示例显示了聚合其他可配置类的类的配置部分

MyProblem:ConfigurationManager.GetSection不返回节

我创建了一个控制台应用程序

  • 命名空间:TryConfigManagement
  • 添加参考:System.Configuration
  • 更改了App.Config(始终复制),如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    
      <!-- Configuration section-handler declaration area.  -->
      <configSections>
        <sectionGroup name="pageAppearanceGroup">
          <section
            name="pageAppearance"
            type="TryConfigManagement.PageAppearance"
            allowLocation="true"
            allowDefinition="Everywhere"
            />
        </sectionGroup>
      </configSections>
    
      <!-- Configuration section settings area. -->
      <pageAppearanceGroup>
        <pageAppearance remoteOnly="true">
          <font name="TimeNewRoman" size="18"/>
          <color background="000000" foreground="FFFFFF"/>
        </pageAppearance>  
      </pageAppearanceGroup>
    
      <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
      </startup>
    </configuration>
    
    这段代码引发以下异常:

    An error occurred creating the configuration section handler
    for pageAppearanceGroup/pageAppearance:
    Could not load type 'TryConfigManagement.PageAppearanceSection'
    from assembly 'System.Configuration, Version=4.0.0.0,
    Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
    (C:\...\bin\Debug\TryConfigManagement.vshost.exe.config line 6)
    
    虽然我完全按照示例中的方法进行了操作,但我从StackOverflow中发现,我应该添加程序集信息,可能如下所示:

    class Program
    {
        static void Main(string[] args)
        {
            var assembly = Assembly.GetExecutingAssembly();
            string sectionName = "pageAppearanceGroup/pageAppearance ," +
                assembly.FullName;
            object section = ConfigurationManager.GetSection(sectionName);
    
    现在不再抛出异常,但返回值为null

    我认为这与配置文件的节名中的类型有关。但是,尝试添加完整程序集名称等不同的值并没有帮助

    唉,我在GetSection中找不到很多关于string参数的信息


    那么,my app.config或GetSection调用有什么问题吗?

    您可以尝试指定配置中TryConfigManagement.PageAppearance类型所在的程序集:

     <sectionGroup name="pageAppearanceGroup">
          <section
            name="pageAppearance"
            type="TryConfigManagement.PageAppearance, TryConfigManagement"
            allowLocation="true"
            allowDefinition="Everywhere"
            />
        </sectionGroup>
    
    
    
    然后不要在GetSection参数中包含程序集名称


    另外,删除你的章节名称后的空格。

    Smiech关于区分大小写的评论有帮助(thanx Smiech!),但这不是完整的答案

    如果使用ConfigurationSectionGroupCollection和ConfigurationSectionCollection类,则阅读和维护比使用“pageAppearanceGroup/pageAppearance”之类的神奇字符串处理要容易得多

    代码如下所示:

    namespace MyNameSpace
    {
        class Program
        {
            static void Main(string[] args)
            {
                const string configGroupName = "pageAppearanceGroup";
                const string configSectionName = "pageAppearance";
    
                Configuration config =  ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
                ConfigurationSectionGroup configGroup = config.SectionGroups[configGroupName];
                PageAppearanceSection pageAppearanceConfig = (PageAppearanceSection)configGroup.Sections[configSectionName];
    
    在此之后,我可以执行以下语句:

    Console.WriteLine("PageAppearance property values:");
    Console.WriteLine("RemoteOnly = " + pageAppearanceConfig.RemoteOnly);
    Console.WriteLine("Font: Name = {0}, Size = {1}",
        pageAppearanceConfig.Font.Name,
        pageAppearanceConfig.Font.Size);
    Console.WriteLine("Color: Foreground {0}, Background {1}",
        pageAppearanceConfig.Color.Foreground,
        pageAppearanceConfig.Color.Background);
    
    注意:为了理解App.Config,我将名称空间更改为MyNameSpace。程序集名称仍然是TryConfigManagement

    为完整起见,请注意App.Config的内容,其中使用了名称空间和程序集名称

        <?xml version="1.0" encoding="utf-8"?>
        <configuration>
          <!-- Configuration section-handler declaration area.  -->
          <configSections>
            <sectionGroup name ="pageAppearanceGroup">
              <section name="pageAppearance"
                       type ="TryConfigManagement.PageAppearanceSection, TryConfigManagement"
                       allowLocation="true"
                       allowDefinition="Everywhere"
                       />
            </sectionGroup>
          </configSections>
    
          <!-- Configuration section settings area. -->
          <pageAppearanceGroup>
             <pageAppearance>
              <font name="TimeNewRoman" size="18"/>
              <color background="000000" foreground="FFFFFF"/>
            </pageAppearance>  
          </pageAppearanceGroup>
        </configuration>
    
    
    
    节定义的字段:

    • 配置设置区域中设置的名称。必须位于同一设置组中
    • 类型:configurationSection(的派生类)的实际类型。这包括命名空间。分号后是程序集名称。它不必是完整的程序集名称

    现在我要做的就是找到一种方法去除所有的魔法字符串。但那是另一回事。

    尝试过。我甚至还尝试过full assemblyname写在一个类似的stackoverflow问题中:您在当前解决方案中是否尝试过删除节名后的空格?注意字母大小写。使用您键入的字母大小写,而不是配置节名称(TryConfigManagement.pageAppearance)
        <?xml version="1.0" encoding="utf-8"?>
        <configuration>
          <!-- Configuration section-handler declaration area.  -->
          <configSections>
            <sectionGroup name ="pageAppearanceGroup">
              <section name="pageAppearance"
                       type ="TryConfigManagement.PageAppearanceSection, TryConfigManagement"
                       allowLocation="true"
                       allowDefinition="Everywhere"
                       />
            </sectionGroup>
          </configSections>
    
          <!-- Configuration section settings area. -->
          <pageAppearanceGroup>
             <pageAppearance>
              <font name="TimeNewRoman" size="18"/>
              <color background="000000" foreground="FFFFFF"/>
            </pageAppearance>  
          </pageAppearanceGroup>
        </configuration>