根元素必须与引用该文件的部分名称匹配。

3

我正在使用AppSettings的“File”属性,但是遇到了以下错误:

根元素必须与引用文件的部分名称匹配,“appSettings”

我在我的Windows项目中添加了ClassLibrary1.dll和ClassLibrary1.dll.config。我的Windows应用程序有自己的app.config

<configuration>
 <appSettings file="ClassLibrary1.dll.config"> 
    <add key="main" value="main"/>
  </appSettings>
</configuration>

thankx in advance


我不知道如何接受答案,因为我在这里很新,还有一个问题...如果我有一个外部配置文件,这可以工作,但如果我有多个外部配置文件呢? - slash shogdhe
1
重新发布我的评论:在这种情况下,我认为您应该重新考虑设计。根据您的文件名“ClassLibrary1.dll.config”,我假设您的方法是拥有多个类库,每个类库都有自己的“config”文件来覆盖可执行文件的配置文件中的appSettings部分。对我来说,每个类库都有其自己的appSettings存储的设置。相反,尝试为您的类库创建自定义配置部分,以保持每个库的设置分开。然后,您可以使用configSource属性,该属性类似于appSettings文件属性。 - Dr. Wily's Apprentice
斜杠shogdhe:好的,现在请接受最有帮助解决您问题的答案 - 这是在SO上正确的做法。 - slash shogdhe
6个回答

12

你的外部文件必须长这样:

<?xml version="1.0"?>
<appSettings>
  <add key="main" value="main"/>
</appSettings>
与使用configSource时不同,使用file属性时无法配置节点。我甚至不确定在使用configSource属性时是否可以使用配置节点,我总是匹配被外部化的根节点。更多信息请参阅MSDN文档:http://msdn.microsoft.com/en-us/library/ms228154.aspx 此外,我从未尝试引用程序集配置文件,就像你这里所做的那样。我想知道是否会导致问题?尝试将仅appSettings节点提取到另一个配置文件中,看看是否可以解决问题。
编辑:此外文件(我们将其称为appSettings_external.config)可用于两种方式:
app.config:(设置已合并)
   <?xml version="1.0"?>
   <configuration>
    <appSettings file="appSettings_external.config">
      <add key="main" value="main"/>
    </appSettings>
   </configuration>

app.config:(只有从外部配置中拉取设置)

   <?xml version="1.0"?>
   <configuration>
    <appSettings configSource="appSettings_external.config" />
   </configuration>

3
+1 就是这样 - 正如错误信息所清楚表明的那样:根元素必须与引用文件的部分名称匹配... - marc_s
是的,很难确定 ClassLibrary1.dll.config 中有什么,因为他没有发布它 ;D - Joseph Yaduvanshi
如果我只有一个外部配置文件,这个方法可以工作。但是如果我有多个外部配置文件呢? - slash shogdhe
1
+1 这个选项对我来说效果最好。被接受的答案也可以,但它没有将键添加到“ConfigurationManager.AppSettings”值集合中 - 而这个选项则有。 - Laughing Lemonade

4

请确保您文件“ClassLibrary1.dll.config”中的根XML元素为“appSettings”。该行代码的意思是什么? - slash shogdhe
如果我只有一个外部配置文件,这个方法可以工作。但是如果我有多个外部配置文件呢? - slash shogdhe
在这种情况下,我认为你应该重新考虑你的设计。根据你的文件名“ClassLibrary1.dll.config”,我猜测你的方法是拥有多个类库,每个类库都有自己的“config”文件来覆盖可执行文件的配置文件中的appSettings部分。对我来说,每个类库都有其自己的appSettings存储的设置。相反,尝试为你的类库创建自定义配置部分,以保持每个库的设置分开。然后,您可以使用configSource属性,它类似于appSettings文件属性。 - Dr. Wily's Apprentice

3

根据原帖最近的评论,这是我的跟进答案:如果我有多个外部配置文件怎么办?

我的建议是修改配置设置的设计。我假设您有多个类库,每个类库都有自己的一组设置,目前存储在appSettings部分中。在这种情况下,您的配置文件可能看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- App Settings for Class Library 1 -->
    <add key="ClassLibrary1Value1" value="123"/>
    <add key="ClassLibrary1Value2" value="234"/>
    <add key="ClassLibrary1Value3" value="345"/>
    <!-- App Settings for Class Library 2 -->
    <add key="ClassLibrary2Value1" value="ABC"/>
    <add key="ClassLibrary2Value2" value="BCD"/>
    <add key="ClassLibrary2Value3" value="CDE"/>
  </appSettings>
</configuration>

您访问这些设置的代码可能如下所示:

        var appSettings = System.Configuration.ConfigurationManager.AppSettings;
        Console.WriteLine(appSettings["ClassLibrary1Value1"]);
        Console.WriteLine(appSettings["ClassLibrary1Value2"]);
        Console.WriteLine(appSettings["ClassLibrary1Value3"]);

        Console.WriteLine(appSettings["ClassLibrary2Value1"]);
        Console.WriteLine(appSettings["ClassLibrary2Value2"]);
        Console.WriteLine(appSettings["ClassLibrary2Value3"]);

相反,我建议您尝试将每个类库的设置分别放置在其自己的配置部分中。您可以通过修改可执行文件的配置文件来实现此目的,使其看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="classLibrary1" type="System.Configuration.AppSettingsSection"/>
    <section name="classLibrary2" type="System.Configuration.AppSettingsSection"/>
  </configSections>
  <classLibrary1 configSource="ClassLibrary1.dll.config" />
  <classLibrary2 configSource="ClassLibrary2.dll.config" />
</configuration>

您的 ClassLibrary1.dll.config 文件看起来会像这样:

<?xml version="1.0" encoding="utf-8" ?>
<classLibrary1>
  <add key="Value1" value="123"/>
  <add key="Value2" value="234"/>
  <add key="Value3" value="345"/>
</classLibrary1>

您的 ClassLibrary2.dll.config 文件应该如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<classLibrary2>
  <add key="Value1" value="ABC"/>
  <add key="Value2" value="BCD"/>
  <add key="Value3" value="CDE"/>
</classLibrary2>

你可以使用以下代码访问这些设置:

        var classLibrary1AppSettings = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("classLibrary1");
        Console.WriteLine(classLibrary1AppSettings["Value1"]);
        Console.WriteLine(classLibrary1AppSettings["Value2"]);
        Console.WriteLine(classLibrary1AppSettings["Value3"]);

        var classLibrary2AppSettings = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("classLibrary2");
        Console.WriteLine(classLibrary2AppSettings["Value1"]);
        Console.WriteLine(classLibrary2AppSettings["Value2"]);
        Console.WriteLine(classLibrary2AppSettings["Value3"]);

这是可以的,但我不想使用这个后台代码,实际上我想要像这样的东西:如果我写string[] allkeys =System.Configuration.ConfigurationManager.AppSettings.AllKeys;,那么我将获得所有配置的密钥..... - slash shogdhe
在我的示例中,你可以执行 classLibrary1AppSettings.AllKeysclassLibrary2AppSettings.AllKeys。你想把所有外部配置文件中的设置合并到一个单独的对象中,这样你就可以执行类似于 settings.AllKeys 的操作吗?我不认为有任何内置功能支持这样的操作,我会质疑这是否是一个好主意。如果你有两个使用相同键的类库,那么该怎么合并这些设置呢? - Dr. Wily's Apprentice
此外,我唯一能想象到你想使用AppSettings.AllKeys的原因是为了跟踪目的。否则,如果您的应用程序不知道配置文件中应该有哪些设置,那么它如何使用这些设置呢?如果您在不知道键是什么的情况下使用存储在AppSettings中的设置,则应该问自己您尝试放入配置文件中的设置实际上是“配置设置”还是“数据”。 - Dr. Wily's Apprentice
@Dr.Wily的学徒:当我使用像你的自定义配置节点(classLibrary2)时,我遇到了错误:“未识别的元素“ClassLibrary2”。如果我在那之前添加<configuration>节点,我会得到“根元素必须与引用文件的部分名称匹配”的错误。请告诉我出了什么问题。 - Shesha
@Shesha - 我不确定你面临的问题是什么。我的唯一建议是确保:1)在配置文件的<configSections>元素中注册了您的自定义配置部分,2)您正在使用的“<classLibrary2”元素名称与您在<configSections>元素中指定的name属性值匹配(区分大小写),以及3)您在单独文件中用作根元素的元素名称也与您在<configSections>元素中指定的name属性值匹配。 - Dr. Wily's Apprentice

0

结束标签的 / 字符似乎丢失了:

<configuration>
    <appSettings file="ClassLibrary1.dll.config"> 
        <add key="main" value="main" />
    </appSettings>
</configuration>

0
除了确保您的外部配置文件满足错误消息中指定的要求(即xml的根元素应为appSettings),您还可以检查VS是否未读取旧版本。当您修改外部配置文件时,不会触发重新编译,因此每次更改都应该同时修改主Web.config文件,以便刷新它(或至少触碰它)。

0

如果我只有一个外部配置文件,这个方法是有效的。但如果我有多个外部配置文件呢? - slash shogdhe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接