Системе конфигурации не удалось инициализировать ошибку при загрузке пользовательского раздела из app.config

2

Я определил раздел конфигурации в моем 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 class

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, вы можете отобразить его полностью?
  • 0
    Я добавил полный файл app.config, пожалуйста, посмотрите на него ...
Показать ещё 3 комментария
Теги:

1 ответ

0
Лучший ответ

Запустив код, я получил ошибку: "Элемент <Company> может появляться только один раз в этом разделе" в строке:

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

Если вам не нужны атрибуты, называемые "имя" и "код", вы можете просто использовать приведенный выше код, иначе вы могли бы использовать Reflector, чтобы получить представление о том, что делает NameValueCollection и работает оттуда!

  • 1
    я обнаружил ошибку, на самом деле, когда я заменил элемент компании с надписью, он работает нормально ... в любом случае спасибо за руководство

Ещё вопросы

Сообщество Overcoder
Наверх
Меню