[C# / .Net 2] Fichiers de configuration ?

Après pas mal de recherches sur le net et la découverte de 0 tutoriaux (et une doc msdn ou pas mal de points restent obscures pour moi), je me résoud à poser ma question ici.

Je developpe actuellement une application en C#/.Net 2, et je souhaite y intégrer la gestion de configuration utilisateur.

Tout d’abord, avant d’aller plus, voila mes besoins (comme ça si je n’ai pas compris ce que pouvait m’apporter les Settings de .net 2, vous pouvez me l’indiquer tout de suite):

  • Une liste de settings de type ‘string’ fixes (autrement dit, en readonly)
  • Une liste de groupes de settings de type string, donc la quantité et les noms doivent être obtenus dynamiquement.
    Par exemple, un settings.group1 qui contient 3 chaines, un settings.group2 qui en contient 7, etc etc …

A première vue, c’est implémentable avec le systeme de .net 2, mais pasm oyen de comprendre comment.

Alors j’ai trouvé un truc assez génial, dériver une classe depuis ApplicationSettingsBase, j’en fait une pour chaque “groupe”, et je sauve ceux que je veux.

Sauf que.

Si j’ai bien dérivé une classe, pas moyen de trouver comment m’en servir après coup.
L’instancier, jouer avec puis faire un maclass.Save() ? ca sauve où ? Pas dans le dossier de l’appli en tout cas.

Et puis après comment “fusionner” ces différentes classes dans un seul fichier de config ? Parce que si j’ai bien compris chaque classe dérivé aura son fichier de conf, et ça c’est pas sexy du tout.

Merci d’avance si quelqu’un sait m’aider la dessus, google n’est pas très prolixe sur le sujet

http://blogs.msdn.com/rprabhu/articles/433979.aspx

http://blogs.msdn.com/rprabhu/archive/category/6591.aspx

Un bon depart je pense…

Pour le strings en read only et tous les settings qui sont application scope et pas user scope, vaut mieux utiliser un resx et un .exe.config respectivement. User scope voir plus haut.

Bon Glop c’est officiel, je t’aime (aka merci)

Après avoir “joué” avec pendant quelques heures, il me reste un petit problème.

Alors pour ce qui est des chaines “fixes”, étant donné qu’il s’agit d’url et autres, qui ne doivent normallement jamais changer, mais qu’au cas où je veux pouvoir changer sans trop de probleme, je me suis tourné vers le app.config

J’ai donc un truc qui ressemble à ça:

System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); MessageBox.Show(config.AppSettings.Settings["blah"].Value);

Problème: en cas de disparition de l’app.config, je me prend un joli crash de la part de mon programme. J’ai résolu ça en try/catchant tout ça, et si il manque un truc je met un joli message et je quitte.
Bonne manière de faire ?

Pour ce qui est des config utilisateurs, j’en ai pas mal chié, et j’ai finis par faire une liste de classes dérivées de ApplicationSettingsBase, j’en ai une pour l’appli, et une par “module” (je l’importe, et je la traite ensuite en tant que ApplicationSettingsBase, tout marche très bien).

Seul problème: il est possible dedans de specifier des propriétés en application scope :

[ApplicationScopedSetting()] [DefaultSettingValue("123")] public int test { get { return ((int)this["test"]); } set { this["test"] = (int)value; } }
Le problème, c’est que celles-ci ne sont sauvées nulle part, ni dans le user.config (où sont sauvés les trucs mis en user scope de ces classes, donc), ni dans le app.config (et donc toujours leur valeurs par defaut au redemarrage, même si je fais moninstance.Save(); )

J’ai bien tenté d’y rajouter
[SettingsProvider(“System.Configuration.LocalFileSettingsProvider”)]
Mais ça n’a rien aidé (et accessoirement je n’y croyait pas trop).

Une idée ?

Question bonus, existe-t-il un moyen “simple” de rediriger la conf dans un fichier choisis soi même, et non dans celui par defaut ? J’ai cru comprendre que non, mais c’est pas très clair (ça, ou j’en chie avec mon anglais).

C’est dommage parce que ça semble être capable de tout faire mais je suis de plus en plus tenté de refaire un truc de la base même si il sera ouatmille fois moins compliqué, au moins je saurais ocmment il marche. Là j’avance à tatons et ça ne me plait pas.

[quote=“Azera, post:4, topic: 31523”]Après avoir “joué” avec pendant quelques heures, il me reste un petit problème.

Alors pour ce qui est des chaines “fixes”, étant donné qu’il s’agit d’url et autres, qui ne doivent normallement jamais changer, mais qu’au cas où je veux pouvoir changer sans trop de probleme, je me suis tourné vers le app.config

J’ai donc un truc qui ressemble à ça:

System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); MessageBox.Show(config.AppSettings.Settings["blah"].Value);

Problème: en cas de disparition de l’app.config, je me prend un joli crash de la part de mon programme. J’ai résolu ça en try/catchant tout ça, et si il manque un truc je met un joli message et je quitte.
Bonne manière de faire ?[/quote]
Nooon. Tu testes ton truc avec un truc du genre:
string blah = config.AppSettings.Settings[“blah”];
if(string.IsNullOrEmpty(blah))
{
// y a pas la valeur
} else {
// y a la valeur
}

On utilise pas les exceptions pour gerer les cas d’erreur “previsibles”.

J’ai l’impression que tu n’es vraiment pas parti dans la bonne direction avec ta surcharge de AppSettings.

Tu as regardé du côté de ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel) ?

Ca permet de gérer les fichiers de configuration de niveau Utilisateur/Application.

Ensuite, tu devrais pouvoir créer ta propre ConfigurationSection qui te convienne, qui permet d’ajouter des groupes et des éléments. Y’a de bons exemples sur msdn sur l’implémentation avec simplement des attributs (mode déclaratif).