C# ConfigurationManager.GetSection不';t返回自定义部分
因为我的新项目有一个复杂的配置结构,所以我正在学习如何将类ConfigurationManager用于自定义配置 为此,我举了一个例子。此示例显示了聚合其他可配置类的类的配置部分 MyProblem:ConfigurationManager.GetSection不返回节 我创建了一个控制台应用程序C# ConfigurationManager.GetSection不';t返回自定义部分,c#,configuration,configurationmanager,C#,Configuration,Configurationmanager,因为我的新项目有一个复杂的配置结构,所以我正在学习如何将类ConfigurationManager用于自定义配置 为此,我举了一个例子。此示例显示了聚合其他可配置类的类的配置部分 MyProblem:ConfigurationManager.GetSection不返回节 我创建了一个控制台应用程序 命名空间:TryConfigManagement 添加参考:System.Configuration 更改了App.Config(始终复制),如下所示: <?xml version="1.0"
- 命名空间: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>
虽然我完全按照示例中的方法进行了操作,但我从StackOverflow中发现,我应该添加程序集信息,可能如下所示: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)
现在不再抛出异常,但返回值为null 我认为这与配置文件的节名中的类型有关。但是,尝试添加完整程序集名称等不同的值并没有帮助 唉,我在GetSection中找不到很多关于string参数的信息class Program { static void Main(string[] args) { var assembly = Assembly.GetExecutingAssembly(); string sectionName = "pageAppearanceGroup/pageAppearance ," + assembly.FullName; object section = ConfigurationManager.GetSection(sectionName);
那么,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];
注意:为了理解App.Config,我将名称空间更改为MyNameSpace。程序集名称仍然是TryConfigManagement 为完整起见,请注意App.Config的内容,其中使用了名称空间和程序集名称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);
<?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>