title: Custom app.config WPF application
body: <p>I'm trying to create a custom section in my app.config file, but when I run it, I get an error that I'm not sure how to fix. I've been reading up online on how to create these classes, but it appears I'm doing something wrong.</p>
  
  <p>Any help on this would be greatly appreciated!</p>
  
  <p>This is code giving the error:</p>
  
  <pre><code>public void LoadConfiguration() 
  {
      try 
      {
          // error is on the following line
          QueriesSection section = ConfigurationManager.GetSection("queries") as QueriesSection;
          Assert.IsNotNull(section, "section is null");
  
          QueriesCollection queries = section.Queries;
          Assert.AreNotEqual(0, queries.Count, "queries.Count != 0; actual = " + queries.Count);
      }
  
      catch (Exception ex)
      {
          Console.WriteLine(ex.ToString());
      }
  }
  </code></pre>
  
  <p>The <code>App.config</code> file:</p>
  
  <pre><code>&lt;configuration&gt;
      &lt;configSections&gt;
          &lt;section name="queries" type="app.Config.QueriesSection, app" /&gt;
      &lt;/configSections&gt;
      &lt;queries&gt;
          &lt;add name="TableAvailability" sql="SELECT stuff FROM sometable" /&gt;
      &lt;/queries&gt;    
  &lt;/configuration&gt;
  </code></pre>
  
  <p>These are the config classes:</p>
  
  <pre><code>namespace app.Config
  {
      public sealed class QueriesSection : ConfigurationSection 
      {
          public QueriesSection()
          {
          }
  
          [ConfigurationProperty("")]
          public QueriesCollection Queries 
          {
              get { return (QueriesCollection)base[""]; }
          }
      }
  
      public sealed class QueryElement : ConfigurationElement
      {
          [ConfigurationProperty("name", IsKey = true)]
          public String Name {
              get { return (String)base["name"]; }
              set { base["name"] = value; }
          }
  
          [ConfigurationProperty("sql")]
          public String Sql {
              get { return (String)base["sql"]; }
              set { base["sql"] = value; }
          }
      }
  
      public sealed class QueriesCollection : ConfigurationElementCollection 
      {
          protected override ConfigurationElement CreateNewElement() 
          {
              return new QueryElement();
          }
  
          protected override object GetElementKey(ConfigurationElement element)
          {
              return ((QueryElement)element).Name;
          }
  
          public override ConfigurationElementCollectionType CollectionType 
          {
              get { return ConfigurationElementCollectionType.BasicMap; }
          }
  
          protected override string ElementName 
          {
              get { return "query"; }
          }
      }
  }
  </code></pre>
  
  <p>And this is the giant exception that:</p>
  
  <pre><code>System.Windows.Markup.XamlParseException was unhandled
    Message='The invocation of the constructor on type 'app.MainWindow' that matches the specified binding constraints threw an exception.' Line number '3' and line position '9'.
    Source=PresentationFramework
    LineNumber=3
    LinePosition=9
    StackTrace:
         at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
         at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
         at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
         at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
         at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
         at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
         at System.Windows.Application.DoStartup()
         at System.Windows.Application.&lt;.ctor&gt;b__1(Object unused)
         at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
         at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
         at System.Windows.Threading.DispatcherOperation.InvokeImpl()
         at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
         at System.Threading.ExecutionContext.runTryCode(Object userData)
         at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
         at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
         at System.Windows.Threading.DispatcherOperation.Invoke()
         at System.Windows.Threading.Dispatcher.ProcessQueue()
         at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp; handled)
         at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&amp; handled)
         at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
         at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
         at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
         at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
         at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
         at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG&amp; msg)
         at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
         at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
         at System.Windows.Application.RunDispatcher(Object ignore)
         at System.Windows.Application.RunInternal(Window window)
         at System.Windows.Application.Run(Window window)
         at System.Windows.Application.Run()
         at app.App.Main() in C:\Documents and Settings\C15919\my documents\visual studio 2010\Projects\app\app\obj\x86\Debug\App.g.cs:line 0
         at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
         at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
         at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
         at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
         at System.Threading.ThreadHelper.ThreadStart()
    InnerException: System.Configuration.ConfigurationErrorsException
         Message=An error occurred creating the configuration section handler for queries: The string cannot be null or empty.
  Parameter name: name
         Source=System.Configuration
         BareMessage=An error occurred creating the configuration section handler for queries: The string cannot be null or empty.
  Parameter name: name
         Line=0
         StackTrace:
              at System.Configuration.BaseConfigurationRecord.CallCreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader, String filename, Int32 line)
              at System.Configuration.BaseConfigurationRecord.CreateSectionDefault(String configKey, Boolean getRuntimeObject, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object&amp; result, Object&amp; resultRuntimeObject)
              at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object&amp; result, Object&amp; resultRuntimeObject)
              at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object&amp; result, Object&amp; resultRuntimeObject)
              at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object&amp; result, Object&amp; resultRuntimeObject)
              at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
              at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
              at System.Configuration.ConfigurationManager.GetSection(String sectionName)
              at app.MainWindow..ctor() in C:\Documents and Settings\C15919\my documents\visual studio 2010\Projects\app\app\MainWindow.xaml.cs:line 26
         InnerException: System.ArgumentException
              Message=The string cannot be null or empty.
  Parameter name: name
              Source=System.Configuration
              ParamName=name
              StackTrace:
                   at System.Configuration.ConfigurationProperty.ValidatePropertyName(String name)
                   at System.Configuration.ConfigurationProperty.ConstructorInit(String name, Type type, ConfigurationPropertyOptions options, ConfigurationValidatorBase validator, TypeConverter converter)
                   at System.Configuration.ConfigurationProperty..ctor(PropertyInfo info)
                   at System.Configuration.ConfigurationElement.CreateConfigurationPropertyFromAttributes(PropertyInfo propertyInformation)
                   at System.Configuration.ConfigurationElement.CreatePropertyBagFromType(Type type)
                   at System.Configuration.ConfigurationElement.PropertiesFromType(Type type, ConfigurationPropertyCollection&amp; result)
                   at System.Configuration.ConfigurationElement.get_Properties()
                   at System.Configuration.ConfigurationElement.Reset(ConfigurationElement parentElement)
                   at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionImpl(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
                   at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionWithFullTrust(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
                   at System.Configuration.RuntimeConfigurationRecord.CreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
                   at System.Configuration.BaseConfigurationRecord.CallCreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader, String filename, Int32 line)
              InnerException: 
  </code></pre>