Modifier dynamiquement le fichier app.config par défaut pendant l'exécution
Description du problème :
Développez une solution qui charge dynamiquement les sections de configuration à partir de modules d'application chargés dynamiquement dans un nouveau fichier app.config en mémoire, garantissant que l'application utilise de manière transparente la configuration modifiée sans écraser la configuration par défaut.
Solution :
Les questions connexes suggèrent d'utiliser la méthode SetData
pour modifier le chemin du système de configuration, mais cela n'est efficace que lorsqu'il est exécuté avant la première utilisation du système de configuration. Pour résoudre complètement ce problème, les valeurs de configuration mises en cache doivent également être effacées.
Mise en œuvre :
Le code suivant montre comment obtenir le comportement souhaité :
<code class="language-csharp">using System; using System.Configuration; using System.Linq; using System.Reflection; public abstract class AppConfig : IDisposable { public static AppConfig Change(string path) { return new ChangeAppConfig(path); } public abstract void Dispose(); private class ChangeAppConfig : AppConfig { private readonly string oldConfig = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); private bool disposedValue; public ChangeAppConfig(string path) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); ResetConfigMechanism(); } public override void Dispose() { if (!disposedValue) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig); ResetConfigMechanism(); disposedValue = true; } GC.SuppressFinalize(this); } private static void ResetConfigMechanism() { typeof(ConfigurationManager) .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, 0); typeof(ConfigurationManager) .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); typeof(ConfigurationManager) .Assembly.GetTypes() .Where(x => x.FullName == "System.Configuration.ClientConfigPaths") .First() .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); } } }</code>
Utilisation :
Pour modifier temporairement app.config pour une portée spécifique :
<code class="language-csharp">using (AppConfig.Change(tempFileName)) { // 应用程序使用修改后的 app.config }</code>
Pour modifier définitivement app.config pour tout le runtime :
<code class="language-csharp">// 应用程序使用修改后的 app.config AppConfig.Change(tempFileName);</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!