Can't get my custom configuration section
.net, app-config, c#, configurationmanager
Solution
You have put wrong configuration section type name here:
<section name="Biotronik.NGMP.DAL.Sources.DalBaseSettings"
type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
You should use name of your custom configuration section type here:
type="BurnIn.UI.BurnInConfigurationSection, AssemblyWhereThisTypeIsDeclared"
Problem
I am trying to create a custom config section to load the list of 'ovens' my application monitors. This is my first experience with config sections and I have tried to follow the examples; but, I can't figure out what I am missing. When I try to get the config section I get the following exception: An error occurred creating the configuration section handler for BurnIn: Could not load type 'BurnIn.UI.BurnInConfigurationSection' from assembly 'System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. (C:\MKS\BurnIn\PC_SW\bin\BurnIn.UI.vshost.exe.config line 8) In my main I have tried: System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if (config.Sections[BurnInSection] == null) ... ``` BurnInConfigurationSection burnInConfigSection = config.GetSection(BurnInSection) as BurnInConfigurationSection; BurnInConfigurationSection burnInConfigSection = ConfigurationManager.GetSection(BurnInSection) as BurnInConfigurationSection; ``` Everything seems to result in the same exception When I look at config.FilePath it is "C:\MKS\BurnIn\PC_SW\bin\BurnIn.UI.vshost.exe.config" which I have verified matches the app.config file. Here are my configuration classes: ``` namespace BurnIn.UI { /// <summary> /// BurnIn Application configuration section in app.config /// </summary> public class BurnInConfigurationSection : ConfigurationSection { [ConfigurationProperty("Ovens", IsDefaultCollection = false)] [ConfigurationCollection(typeof(OvenCollection), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] public OvenCollection Ovens { get { return (OvenCollection)base["Ovens"]; } set { base["Ovens"] = value; } } } /// <summary> /// Oven configuration information /// </summary> public class OvenConfig : ConfigurationElement { public OvenConfig() { } public OvenConfig(string nickName, string mesName, string ip, int slotCount) { NickName = nickName; MesName = mesName; IP = ip; SlotCount = slotCount; } [ConfigurationProperty("NickName", DefaultValue = "OvenName", IsRequired = true, IsKey = true)] public string NickName { get { return (string)this["NickName"]; } set { this["NickName"] = value; } } [ConfigurationProperty("MesName", DefaultValue = "MesName", IsRequired = true, IsKey = true)] public string MesName { get { return (string)this["MesName"]; } set { this["MesName"] = value; } } [ConfigurationProperty("IP", DefaultValue = "10.130.110.20", IsRequired = true, IsKey = false)] public string IP { get { return (string)this["IP"]; } set { this["IP"] = value; } } [ConfigurationProperty("SlotCount", DefaultValue = "20", IsRequired = true, IsKey = false)] public int SlotCount { get { return (int)this["SlotCount"]; } set { this["SlotCount"] = value; } } } /// <summary> /// Collection of Oven Configs /// </summary> public class OvenCollection : ConfigurationElementCollection { public OvenCollection() { } public OvenConfig this[int index] { get { return (OvenConfig)BaseGet(index); } set { if (BaseGet(index) != null) { BaseRemoveAt(index); } BaseAdd(index, value); } } public void Add(OvenConfig ovenConfig) { BaseAdd(ovenConfig); } public void Clear() { BaseClear(); } protected override ConfigurationElement CreateNewElement() { return new OvenConfig(); } protected override object GetElementKey(ConfigurationElement element) { return ((OvenConfig)element).NickName; } public void Remove(OvenConfig ovenConfig) { BaseRemove(ovenConfig.NickName); } public void RemoveAt(int index) { BaseRemoveAt(index); } public void Remove(string name) { BaseRemove(name); } } } ``` Here is my app.config: ``` <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="Biotronik.NGMP.DAL.Sources.DalBaseSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> <section name="BurnIn" type="BurnIn.UI.BurnInConfigurationSection"/> </configSections> <applicationSettings> <Biotronik.NGMP.DAL.Sources.DalBaseSettings> <setting name="ConfigFileName" serializeAs="String"> <value>DalConfig.xml</value> </setting> <setting name="MappingFileName" serializeAs="String"> <value>BurnInTestPlanMap.tpx</value> </setting> </Biotronik.NGMP.DAL.Sources.DalBaseSettings> </applicationSettings> <connectionStrings> <add name="BurnInConnection" connectionString="metadata=res://*/BurnIn.csdl|res://*/BurnIn.ssdl|res://*/BurnIn.msl;provider=Oracle.DataAccess.Client;provider connection string="DATA SOURCE=XXXX;PASSWORD=xxxx;PERSIST SECURITY INFO=True;USER ID=XXXX"" providerName="System.Data.EntityClient" /> </connectionStrings> <log4net configSource="BurnInLog4net.config"/> <BurnIn> <Ovens> <add NickName="Mark's Oven" MesName="MESBOven" IP="10.130.110.20" SlotCount="5"/> <add NickName="Real Oven" MesName="MESOven1" IP="10.130.110.50" SlotCount="20"/> </Ovens> </BurnIn> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> </configuration> ```