ConfigurationManager.GetSection 没有 return 自定义部分

ConfigurationManager.GetSection doesn't return custom section

因为我的新项目有一个复杂的配置结构,我正在学习如何使用 class ConfigurationManager 和自定义配置。

为此,我以 MSDN How to: Create Custom Configuration Sections Using ConfigurationSection 为例。此示例显示 class 的配置部分,该部分聚合了其他可配置的 classes.

我的问题:ConfigurationManager.GetSection 没有 return 部分

我创建了一个 ConsoleApplication。

请注意,我使用了 MSDN 示例中的配置组。

我的源代码:

namespace TryConfigManagement
{
    class Program
    {
        static void Main(string[] args)
        {
            string sectionName = "pageAppearanceGroup/pageAppearance";
            object section = ConfigurationManager.GetSection(sectionName);

这段代码抛出以下异常:

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)

尽管我完全按照示例中的内容进行了操作,但我从 Whosebug 中了解到我应该添加程序集信息,可能如下所示:

class Program
{
    static void Main(string[] args)
    {
        var assembly = Assembly.GetExecutingAssembly();
        string sectionName = "pageAppearanceGroup/pageAppearance ," +
            assembly.FullName;
        object section = ConfigurationManager.GetSection(sectionName);

现在不再抛出异常,但是 returned 值为 null。

I think it has to do with the type in the section name of the config file. However trying different values like adding full assembly name didn't help.

唉,我在GetSection中找不到很多关于字符串参数的信息。

那么我的 app.config 或者我的 GetSection 调用有什么问题?

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

 <sectionGroup name="pageAppearanceGroup">
      <section
        name="pageAppearance"
        type="TryConfigManagement.PageAppearance, TryConfigManagement"
        allowLocation="true"
        allowDefinition="Everywhere"
        />
    </sectionGroup>

然后不要在 GetSection 参数中包含程序集名称。

此外,删除您的部分名称后的 space

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

如果使用 classes 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>

段定义的字段:

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

现在我要做的就是找到一个方法来摆脱所有的魔法字符串。但那是另一回事。