2009-08-25 7 views
2

Ich habe einen Config-Abschnitt in meinem app.config in folgenden Weise definiert:Konfigurationssystem fehlgeschlagen Fehler zu initialisieren, während eines benutzerdefinierten Abschnitts von Laden app.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="RegisterCompanies" 
      type="ConfigTest.RegisterCompaniesConfig, ConfigTest" 
      allowLocation="true" 
      allowDefinition="Everywhere"/> 
      </configSections>  
    <RegisterCompanies> 
    <Companies> 
     <Company name="Tata Motors" code="Tata"/> 
     <Company name="Honda Motors" code="Honda"/> 
    </Companies> 
    </RegisterCompanies>  
     </configuration> 

diese Informationen zu lesen i drei Klassen erstellt habe in einer solchen Art und Weise: RegisterCompaniesConfig Klasse

public class RegisterCompaniesConfig : ConfigurationSection 
    { 
     public static RegisterCompaniesConfig GetConfig() 
     { 
      string path = Path.Combine(Application.StartupPath, "ConfigTest.exe.config"); 
      Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(path); 
      RegisterCompaniesConfig serviceSection = ConfigurationManager.GetSection("RegisterCompanies") as RegisterCompaniesConfig; 
      return serviceSection; 
      //return (RegisterCompaniesConfig)System.Configuration.ConfigurationManager.GetSection("RegisterCompanies"); 
     } 

     [System.Configuration.ConfigurationProperty("Companies")] 
     public Companies Companies 
     { 
      get 
      { 
       object o = this["Companies"]; return o as Companies; 
      } 
     } 
    } 

dann Firmen Klasse:

public class Companies : ConfigurationElementCollection 
    { 
     [System.Configuration.ConfigurationProperty("Company")] 
     public Company this[int index] 
     { 
      get 
      { 
       return base.BaseGet(index) as Company; 
      } 
      set 
      { 
       if (base.BaseGet(index) != null) 
       { base.BaseRemoveAt(index); } this.BaseAdd(index, value); 
      } 
     } 
     protected override ConfigurationElement CreateNewElement() 
     { 
      return new Company(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) 
     {    
      return ((Company)element).Name; 
     } 
    } 

und die letzte ist Firmenklasse:

public class Company : ConfigurationElement 
    { 
     [ConfigurationProperty("name", IsRequired = true)] 
     public string Name 
     { 
      get 
      { 
       return this["name"] as string; 
      } 
     } 
     [ConfigurationProperty("code", IsRequired = true)] 
     public string Code 
     { 
      get 
      { 
       return this["code"] as string; 
      } 
     } 
    } 

danach, wenn ich durch den Aufruf der Sektion Acess wollen Methode folgende

var config = RegisterCompaniesConfig.GetConfig(); 

erhalte ich die Fehlermeldung: Konfigurationssystem konnte nicht initialisiert werden Bitte jemand hat einen Blick auf diesen oben genannten Code, wo ist das Problem, es sieht alles ist in Ordnung für mich ....

+0

Das Problem muss in der Datei app.config sein, können Sie es vollständig anzeigen? – RRUZ

+0

Ich habe die komplette app.config-Datei hinzugefügt, bitte sehen Sie sie sich an ... –

+0

Können Sie einen Stack Trace für den Fehler anzeigen, den Sie erhalten? – Rob

Antwort

0

Nachdem ich gerade Ihren Code ausgeführt, der Fehler, den ich erhielt, war "The e lement <Firma> darf nur einmal erscheint in diesem Abschnitt“auf der Linie:

RegisterCompaniesConfig serviceSection = ConfigurationManager.GetSection("RegisterCompanies") as RegisterCompaniesConfig; 

Das, dass Sie nur können, um anzuzeigen scheint, mit dem Code haben Sie zur Zeit bekommen, hat ein Unternehmen Element drin.

In der Vergangenheit habe ich folgendes ohne Probleme verwendet:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <sectionGroup name="Libraries"> 
     <section name="MyLibrary" type="System.Configuration.NameValueSectionHandler,system, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" /> 
    </sectionGroup> 
    </configSections> 

    <Libraries> 
    <MyLibrary> 
     <add key="Test" value="Test1"/> 
    </MyLibrary> 
    </Libraries> 
</configuration> 

die ich dann mit Code wie zugegriffen haben:

public string GetValue(string configurationKey, string defaultValue) 
{ 
    NameValueCollection _config = (NameValueCollection)ConfigurationManager.GetSection("Libraries/MyLibrary"); 
    string result = (_config == null) ? null : _config[configurationKey]; 
    return (result == null ? defaultValue : result); 
} 

Wenn Sie nicht tun müssen habe Attribute namens "name" und "code", dann könntest du einfach den obigen Code verwenden, sonst könntest du Reflector verwenden, um eine Vorstellung davon zu bekommen, was die NameValueCollection tut und von dort aus funktioniert!

+1

Ich fand den Fehler, actuallitt wenn ich Ersetzte das Firmenelement durch Hinzufügen, es funktioniert gut. Wie auch immer, danke für die Führung –

Verwandte Themen