添加包含新部分的新外部配置文件后,配置系统无法初始化

Configuration system failed to initialize after adding a new external config file containing a new section

我的应用程序 运行 在 App.config 外部具有 AppSettings.config 和 ConnectionStrings.config。我想添加另一个配置文件 GlobalSettings.config,我将从中提取我不想包含在 AppSettings.config.

中的信息

在准备提出这个问题时,我阅读了以下 SO 问题,实施了建议的解决方案,但没有找到解决方案:

在 运行,我收到一个 {"Configuration system failed to initialize"} 异常,innerException 消息为 'Unrecognized configuration section globalSettings.'

以下是我当前的文件。删除 App.config 的 <globalSettings file="GlobalSettings.config"/> 行允许我的应用程序 运行 成功。

我已尝试根据上述链接的建议重新格式化 GlobalSettings.config 文件。根据我的阅读,我的理解是它应该像在 AppSettings.config 中声明一个新的 configSection 一样工作。从我的经历来看,情况似乎并非如此。

此时,应用程序中没有访问 GlobalSettings.config 的代码,因为它在 运行 时中断。

任何具体方向 and/or 参考 material 的方向表示赞赏。如果我可以提供更多信息,请告诉我。

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <appSettings file="AppSettings.config"/>
  <connectionStrings configSource="ConnectionStrings.config"/>
  <globalSettings file="GlobalSettings.config"/>
</configuration>

全局设置:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="globalSettings"
             type="System.Configuration.AppSettingsSection" requirePermission="false" />
  </configSections>

  <globalSettings>
    <add key="key" value="keyValue" />
  </globalSettings>

</configuration>

阅读以下内容后,我制定了一个可行的解决方案:

  • Moving a custom configuration group to a separate file
  • An error occurred creating the configuration section handler
  • How to get the values of a ConfigurationSection of type NameValueSectionHandler

已更新App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="globalSettings" type="System.Configuration.AppSettingsSection"/>
  </configSections>
  <appSettings file="AppSettings.config"/>
  <connectionStrings configSource="ConnectionStrings.config"/>
  <globalSettings file="GlobalSettings.config"/>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
</configuration>

已更新GlobalSettings.config:

<globalSettings>
  <add key="key" value="keyValue" />
</globalSettings>

函数代码:

private void RetrieveKey()
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            AppSettingsSection globalSettingSection = (AppSettingsSection)config.GetSection("globalSettings");
            key = globalSettingSection.Settings["key"].Value;
        }

我发现您需要在 App.config 中而不是在您正在创建的配置文件中定义新部分。该部分的类型也很重要。您可以使用以下其中一项:

  • type="System.Configuration.AppSettingsSection"
  • type="System.Configuration.IgnoreSectionHandler
  • type="System.Configuration.NameValueSectionHandler"

我发现 type="System.Configuration.AppSettingsSection" 最有用,因为它使配置最像 AppSettings.config 文件。

如果您有任何可以提高效率的更改,请告诉我。