ConfigurationManager - Одна и та же структура App.config в разных проектах - Совместное использование класса

Решено, как показано ниже !! - У меня есть несколько проектов WPF с индивидуальным App.Config с настраиваемыми разделами. Все настраиваемые разделы имеют одинаковую структуру.

Для одного проекта я использовал ConfigurationManager и создал Custom ConfigurationSection, ConfigurationCollection, ConfigurationElement, и все отлично работает для этого проекта.

Затем я переместил свои настраиваемые классы конфигурации в библиотеку классов, чтобы использовать их во всех проектах, но теперь я получаю ошибку System.TypeInitializationException при запуске проекта. Похоже, это связано с тем, что теперь ConfigurationManager не может найти приложение.

Я могу скопировать и вставить класс во все проекты, и он отлично работает, но я не хочу этого делать. Может быть, я упускаю что-то очевидное. Любая помощь очень ценится. Спасибо!!!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;

namespace WordAddinForms
{

    public class CustomConfig : ConfigurationSection
    {
    public static readonly CustomConfig Settings =
        (CustomConfig)ConfigurationManager.GetSection("custom-configuration"); 

    [ConfigurationProperty("activities")]
    public ActivityElementCollection Activities
    {
        get { return (ActivityElementCollection)base["activities"]; }
    }       
    }

    [ConfigurationCollection(typeof(ActivityElement), AddItemName = "activity",
    CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]
    public class ActivityElementCollection : ConfigurationElementCollection, IEnumerable<ActivityElement>
    {
    IEnumerator<ActivityElement> IEnumerable<ActivityElement>.GetEnumerator()
    {
        return this.OfType<ActivityElement>().GetEnumerator();
    }
    public override ConfigurationElementCollectionType CollectionType
    {
        get { return ConfigurationElementCollectionType.BasicMap; }
    }
    protected override string ElementName
    {
        get { return "activity"; }
    }
    protected override ConfigurationElement CreateNewElement()
    {
        return new ActivityElement();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return (element as ActivityElement).Name;
    }

    public ActivityElement this[int index]
    {
        get { return (ActivityElement)base.BaseGet(index); }
        set
        {
        if (base.BaseGet(index) != null)
        {
            base.BaseRemoveAt(index);
        }
        base.BaseAdd(index, value);
        }
    }
    public ActivityElement this[string name]
    {
        get { return (ActivityElement)base.BaseGet(name); }
    }

    }

    public class ActivityElement : ConfigurationElement
    {
    [ConfigurationProperty("name", DefaultValue = "String.Empty")]
    public string Name
    {
        get { return (string)base["name"]; }
    }        
    [ConfigurationProperty("location", DefaultValue = "String.Empty")]
    public string Location
    {
        get { return (string)base["location"]; }
    }       

    [ConfigurationProperty("files")]
    public FileElementCollection Files
    {
        get { return (FileElementCollection)base["files"]; }
    }
    }

    [ConfigurationCollection(typeof(FileElement), AddItemName = "file",
    CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]
    public class FileElementCollection : ConfigurationElementCollection, IEnumerable<FileElement>
    {
    IEnumerator<FileElement> IEnumerable<FileElement>.GetEnumerator()
    {
        return this.OfType<FileElement>().GetEnumerator();
    }
    public override ConfigurationElementCollectionType CollectionType
    {
        get { return ConfigurationElementCollectionType.BasicMap; }
    }
    protected override string ElementName
    {
        get { return "file"; }
    }
    protected override ConfigurationElement CreateNewElement()
    {
        return new FileElement();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return (element as FileElement).Name;
    }

    public FileElement this[int index]
    {
        get { return (FileElement)base.BaseGet(index); }
        set
        {
        if (base.BaseGet(index) != null)
        {
            base.BaseRemoveAt(index);
        }
        base.BaseAdd(index, value);
        }
    }
    public FileElement this[string name]
    {
        get { return (FileElement)base.BaseGet(name); }
    }
    }

    public class FileElement : ConfigurationElement
    {
    [ConfigurationProperty("name", DefaultValue = "String.Empty")]
    public string Name
    {
        get { return (string)base["name"]; }
    }

    /// <remarks />
    [ConfigurationProperty("location", DefaultValue = "String.Empty")]
    public string Location
    {
        get { return (string)base["location"]; }
    }        
    }
}

Изменить - файл App.config -

<?xml version="1.0" ?>
<custom-configuration>
 <activities>
  <activity name="Activities" location=".\Activity\">
    <files>
      <file name="Running" location=".Running\"/>
      <file name="Sports" location=".Sports\"/>
      <file name="Fun" location=".Fun\"/>
      <file name="Exercise" location=".Exercise\"/>     
    </files>
  </activity>  
 </activities>
</custom-configuration>

Вопрос перефразирован - Итак,

1) У меня есть несколько app.config для различных проектов в указанной выше структуре.

2) Я создал собственные классы конфигурации, как показано в приведенном выше коде.

Мне нужно поместить их в библиотеку классов \ общую библиотеку, чтобы я мог повторно использовать классы вместо того, чтобы копировать их в отдельные проекты. Когда я помещаю классы в общую библиотеку, проект перестраивается нормально, но при запуске терпит неудачу.

Ответ. Ясно, что мне нужно правильно понять основы. После переноса кода в библиотеку классов мне пришлось соответственно обновить app.config, поскольку пространство имен и расположение класса изменились. Простите за неудобства. В принципе, мне нужно было обновить «тип» раздела, так как класс теперь принадлежит другой сборке.


person ShipOfTheseus    schedule 28.04.2014    source источник
comment
Если вы не собираетесь делиться кодом, по крайней мере, поделитесь трассировкой стека.   -  person Ant P    schedule 28.04.2014
comment
вам все равно понадобится .dll, если это не сборка GAC.   -  person T McKeown    schedule 28.04.2014
comment
Извините, я добавил код конфигурации, который хочу использовать в библиотеке классов \ общей библиотеке, как указано выше. Он отлично работает, если я включу весь код как часть проекта A. т.е. когда я получаю доступ - CustomConfig.Settings.Categories [mycategory] в проекте A, код работает нормально. Но если я отделю его и помещу в библиотеку классов (classLibraryA), я больше не смогу использовать CustomConfig.Settings.Categories [mycategory] в projectA.   -  person ShipOfTheseus    schedule 28.04.2014


Ответы (1)


Ответ. Ясно, что мне нужно правильно понять основы. После переноса кода в библиотеку классов мне пришлось соответственно обновить app.config, поскольку пространство имен и расположение класса изменились. Простите за неудобства. В принципе, мне нужно было обновить «тип» раздела, так как класс теперь принадлежит другой сборке.

person ShipOfTheseus    schedule 29.04.2014