I'm trying to create a Custom Section in the app.config and run into the following exception:
ConfigurationErrorsException
Unrecognized element 'EncryptedUserCredential'. (C:\My Documents\Hachette.CRM\test_app_appsettings\bin\Debug\test_app_appsettings.vshost.exe.Config line 11)
Now I'm at a complete loss. I have stepped into the RegisterEncryptedUserCredentialsConfig.GetConfig(), and found the Section is null from the propery RegisterEncryptedUserCredentialsConfig.EncryptedUserCredentials. I have also checked all the usual suspects I when investigating online, like:
- Making sure the type includes the assembly name in the app.config configSection when declaring the custom section.
 - is at the beginning of in the app.config.
 
The custom section is written in:
- Class Library
 - C#/.NET 4.0.
 
I'm at a loss and think I have been staring at it too long the weekend gone and need some fresh eyes!
For ease I have added all the code from the C# class library here.
Here is the app.config:
<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="EncryptedUserCredentials"
             type="Hachette.Common.CustomConfigSections.RegisterEncryptedUserCredentialsConfig, Hachette.Common"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <EncryptedUserCredentials>
    <EncryptedUserCredential userName="garethB" password="1235@"/>
    <EncryptedUserCredential userName="webService" password="123ffff5@"/>
  </EncryptedUserCredentials>
</configuration>
Here is the EncryptedUserCredential ConfigurationElement:
public class EncryptedUserCredential : ConfigurationElement
{
    [ConfigurationProperty("userName", IsRequired = true)]
    public string UserName
    {
        get
        {
            return this["userName"] as string;
        }
    }
    [ConfigurationProperty("password", IsRequired = true)]
    public string Password
    {
        get
        {
            return this["password"] as string;
        }
    }
}
Here is the EncryptedCredentials ConfigurationElementCollection:
public class EncryptedUserCredentials : ConfigurationElementCollection
{
    public EncryptedUserCredential this[int index]
    {
        get
        {
            return base.BaseGet(index) as EncryptedUserCredential;
        }
        set
        {
            if (base.BaseGet(index) != null)
            {
                base.BaseRemoveAt(index);
            }
            this.BaseAdd(index, value);
        }
    }
    public new EncryptedUserCredential this[string responseString]
    {
        get
        {
            return (EncryptedUserCredential)BaseGet(responseString);
        }
        set
        {
            if (BaseGet(responseString) != null)
            {
                BaseRemoveAt(BaseIndexOf(BaseGet(responseString)));
            }
            BaseAdd(value);
        }
    }
    protected override ConfigurationElement CreateNewElement()
    {
        return new EncryptedUserCredential();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((EncryptedUserCredential)element).UserName;
    }
}
Here is the RegisterEncryptedUserCredentialsConfig ConfigurationSection:
public class RegisterEncryptedUserCredentialsConfig : ConfigurationSection
{
    public static RegisterEncryptedUserCredentialsConfig GetConfig()
    {
        //var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        return (RegisterEncryptedUserCredentialsConfig)System.Configuration.ConfigurationManager.GetSection("EncryptedUserCredentials") ?? new RegisterEncryptedUserCredentialsConfig();
    }
    [System.Configuration.ConfigurationProperty("EncryptedUserCredentials", IsDefaultCollection=true,IsRequired=true)]
    [ConfigurationCollection(typeof(EncryptedUserCredentials), AddItemName="EncryptedUserCredential")]
    public EncryptedUserCredentials EncryptedUserCredentials
    {
        get
        {
            object o = this["EncryptedUserCredentials"];
            return o as EncryptedUserCredentials;
        }
    }
}
All of the above live in namespace:
namespace Hachette.Common.CustomConfigSections
And in the following Assembly:
