2009-08-25 118 views
2

我在下面的方式定义配置节在我的app.config加载自定义栏目:配置系统初始化失败错误,同时从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> 

要阅读这些信息我已经创建了三个班在这样的方式:RegisterCompaniesConfig类

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; 
      } 
     } 
    } 

然后公司类:

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; 
     } 
    } 

,最后一个是公司类:

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; 
      } 
     } 
    } 

时,我想通过调用下面的方法来接取部分

var config = RegisterCompaniesConfig.GetConfig(); 

我得到的错误:配置系统初始化失败 请任何人都看看上面的代码,问题在哪里,它看起来一切都很好....

+0

该问题必须在app.config文件中,您可以完整显示它? – RRUZ 2009-08-25 10:00:08

+0

我已经添加了完整的app.config文件,请看看它... – 2009-08-25 10:20:16

+0

你能为你收到的错误显示堆栈跟踪吗? – Rob 2009-08-25 10:35:06

回答

0

刚刚运行您的代码,我收到的错误是“电子字元素<公司>只可在上线这一部分”出现一次:

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

这似乎表明,你只能与代码你现在得到的,有一个公司的因素在里面。

在过去,我已经使用了下面没有任何问题:

<?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> 

我已经然后用类似代码访问:

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); 
} 

如果你不这样做到有名为“name”和“code”的属性,那么你可以使用上面的代码,否则你可以使用Reflector来了解NameValueCollection的功能和工作方式!

+1

我发现了错误,当我真的取而代之的公司元素添加它的工作很好..反正thanx引导我 – 2009-08-25 11:16:51

相关问题