Petite information à l'attention de tous ceux qui utilisent des classes dérivées de ConfigurationSection en .Net, et qui m'a quand même fait perdre un bon jour de développement. Si d'aventure la méthode Add() de Configuration.Sections retourne une exception de type TypeLoadException en indiquant que la classe n'est pas publique (alors que si, elle est publique, tout bien comme il faut), c'est que vous rencontrez le même souci que moi. En fait, le message d'erreur est trompeur et le souci est tout autre; c'est tout simplement parce que la signature de votre constructeur possède des paramètres! L'exemple simpliste suivant démontre l'erreur:

using System.Configuration;

namespace ConfigurationSectionTest
{
    public class MyConfigurationSection : ConfigurationSection
    {
        public MyConfigurationSection(object dummy) : base()
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);

            configuration.Sections.Add("test", new MyConfigurationSection(new object()));
        }
    }
}

Si l'on retire le paramètre object du code, miracle, tout fonctionne!

using System.Configuration;

namespace ConfigurationSectionTest
{
    public class MyConfigurationSection : ConfigurationSection
    {
        public MyConfigurationSection() : base()
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);

            configuration.Sections.Add("test", new MyConfigurationSection());
        }
    }
}

Bref, j'espère que cela vous aura sorti une épine du pied...