J'ai le problème suivant:
nous avons une application qui charge des modules (add-ons). Ces modules peuvent avoir besoin d'entrées dans app.config (par exemple, configuration WCF). Étant donné que les modules sont chargés dynamiquement, je ne veux pas avoir ces entrées dans le fichier app.config de mon application.
Ce que je voudrais faire est le suivant:
- Créez un nouveau app.config en mémoire qui incorpore les sections de configuration des modules
- Dites à mon application d'utiliser cette nouvelle application.config
Remarque: je ne souhaite pas écraser le fichier app.config par défaut!
Il devrait fonctionner de manière transparente, de sorte que par exemple ConfigurationManager.AppSettings
utilise ce nouveau fichier.
Lors de mon évaluation de ce problème, j'ai trouvé la même solution que celle fournie ici: Recharger app.config avec nunit .
Malheureusement, cela ne semble rien faire, car je récupère toujours les données du fichier app.config normal.
J'ai utilisé ce code pour le tester:
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
var combinedConfig = string.Format(CONFIG2, CONFIG);
var tempFileName = Path.GetTempFileName();
using (var writer = new StreamWriter(tempFileName))
{
writer.Write(combinedConfig);
}
using(AppConfig.Change(tempFileName))
{
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
}
Il imprime deux fois les mêmes valeurs, bien qu'il combinedConfig
contienne d'autres valeurs que le fichier app.config normal.
la source
AppDomain
avec le fichier de configuration approprié n'est pas une option?Reload app.config with nunit
pourrait fonctionner, pas sûr, s'il est utilisé sur l'entrée de l'application avant le chargement de toute configuration.Réponses:
Le piratage de la question liée fonctionne s'il est utilisé avant la première utilisation du système de configuration. Après ça, ça ne marche plus.
La raison:
il existe une classe
ClientConfigPaths
qui met en cache les chemins. Ainsi, même après avoir changé le chemin avecSetData
, il n'est pas relu, car il existe déjà des valeurs mises en cache. La solution est de les supprimer également:L'utilisation est comme ceci:
Si vous souhaitez modifier le fichier app.config utilisé pour l'ensemble de l'exécution de votre application, il suffit de le mettre
AppConfig.Change(tempFileName)
sans utiliser quelque part au début de votre application.la source
Vous pouvez essayer d'utiliser Configuration et Ajouter ConfigurationSection au moment de l'exécution
EDIT: Voici une solution basée sur la réflexion (pas très sympa cependant)
Créer une classe dérivée de
IInternalConfigSystem
puis par réflexion, définissez-le sur un champ privé dans
ConfigurationManager
la source
file_path
. Cela ne rendra pas la section disponible pour les utilisateurs deConfigurationManager.GetSection
, carGetSection
utilise le fichier app.config par défaut.La solution @Daniel fonctionne bien. Une solution similaire avec plus d'explications est dans le coin c-sharp. Par souci d'exhaustivité, j'aimerais partager ma version: avec
using
, et les indicateurs de bits abrégés.la source
Si quelqu'un est intéressé, voici une méthode qui fonctionne sur Mono.
la source
La solution de Daniel semble fonctionner même pour les assemblys en aval que j'avais déjà utilisé AppDomain.SetData, mais je ne savais pas comment réinitialiser les indicateurs de configuration internes
Converti en C ++ / CLI pour les personnes intéressées
la source
Si votre fichier de configuration est juste écrit avec des clés / valeurs dans "appSettings", vous pouvez lire un autre fichier avec un tel code:
Ensuite, vous pouvez lire section.Settings en tant que collection de KeyValueConfigurationElement.
la source
ConfigurationManager.GetSection
lire le nouveau fichier que j'ai créé. Votre solution ne fait pas cela.ConfigurationManager.GetSection
utilise le fichier app.config par défaut. Il ne se soucie pas du fichier de configuration avec lequel vous avez ouvertOpenMappedExeConfiguration
.Merveilleuse discussion, j'ai ajouté plus de commentaires à la méthode ResetConfigMechanism pour comprendre la magie derrière l'instruction / les appels dans la méthode. Vérification de l'existence du chemin de fichier également ajoutée
la source
Daniel, si possible, essayez d'utiliser d'autres mécanismes de configuration. Nous avons parcouru cette route où nous avions différents fichiers de configuration statiques / dynamiques en fonction de l'environnement / du profil / du groupe et cela est devenu assez compliqué à la fin.
vous pouvez essayer une sorte de service Web de profil où vous ne spécifiez qu'une seule URL de service Web à partir du client et, en fonction des détails du client (vous pouvez avoir des remplacements de niveau de groupe / utilisateur), il charge toute la configuration dont il a besoin. Nous avons également utilisé MS Enterprise Library pour une partie de celui-ci.
c'est-à-dire que vous ne déployez pas la configuration avec votre client et que vous pouvez la gérer séparément de vos clients
la source