0

Résolu comme ci-dessous !! - J'ai plusieurs projets WPF avec App.Config individuel avec des sections personnalisées. Toutes les sections personnalisées ont la même structure.ConfigurationManager - Même App.config structure différents projets - Partage de la classe

Pour un projet, j'ai utilisé ConfigurationManager et créé Custom ConfigurationSection, ConfigurationCollection, ConfigurationElement et tout fonctionne correctement pour ce projet.

Puis j'ai déplacé mes classes de configuration personnalisées dans une bibliothèque de classes afin que je puisse les utiliser dans tous les projets, mais maintenant j'obtiens l'erreur 'System.TypeInitializationException' quand j'exécute le projet. Cela semble être parce que maintenant ConfigurationManager ne peut pas localiser l'application.

Je peux copier coller la classe dans tous les projets et cela fonctionne bien mais je ne veux pas faire cela. Peut-être que je manque probablement quelque chose d'évident. Toute aide est fortement appréciée. Merci!!!

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

Edition - fichier 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> 

Question reformulée - Alors,

1) J'ai plusieurs app.config pour divers projets dans la structure mentionnés ci-dessus

2) J'ai créé des classes de configuration personnalisées comme indiqué dans le code ci-dessus

Je dois les placer dans une bibliothèque de classes \ bibliothèque partagée afin que je puisse réutiliser les classes au lieu de copier-coller dans des projets individuels. Lorsque je place les classes dans une bibliothèque partagée, le projet se reconstruit correctement mais il échoue quand je l'exécute.

Réponse - De toute évidence, j'ai besoin d'avoir les bases. Après avoir déplacé le code dans la bibliothèque de classes, j'ai dû mettre à jour app.config en conséquence car l'espace de noms et l'emplacement de la classe ont maintenant changé. Désolé pour le dérangement. Fondamentalement, je devais mettre à jour "type" de la section que la classe appartient maintenant à l'assemblage différent.

+0

Si vous ne partagez pas le code, partagez au moins la trace de la pile. –

+0

vous aurez toujours besoin du fichier .dll sauf s'il s'agit d'un assembly GAC. –

+0

Désolé, j'ai ajouté le code de configuration que je veux utiliser dans une bibliothèque de classe \ bibliothèque partagée comme ci-dessus. Cela fonctionne bien si j'inclue tout le code dans le cadre du projetA. c'est-à-dire lorsque j'accède - CustomConfig.Settings.Categories ["mycategory"] dans projectA, le code fonctionne correctement. Mais si je le sépare et le place dans la bibliothèque de classes (classLibraryA), je ne peux plus utiliser CustomConfig.Settings.Categories ["mycategory"] dans projectA. – ShipOfTheseus

Répondre

0

Réponse - Il est clair que j'ai besoin de bonnes bases. Après avoir déplacé le code dans la bibliothèque de classes, j'ai dû mettre à jour app.config en conséquence car l'espace de noms et l'emplacement de la classe ont maintenant changé. Désolé pour le dérangement. Fondamentalement, je devais mettre à jour "type" de la section que la classe appartient maintenant à l'assemblage différent.

Questions connexes