2009-08-25 90 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

相關問題