Maison > développement back-end > C++ > Comment puis-je modifier dynamiquement un fichier app.config à l'exécution sans affecter les paramètres par défaut?

Comment puis-je modifier dynamiquement un fichier app.config à l'exécution sans affecter les paramètres par défaut?

Mary-Kate Olsen
Libérer: 2025-01-25 17:32:10
original
172 Les gens l'ont consulté

How Can I Dynamically Modify an App.config File at Runtime Without Affecting the Default Settings?

Ajustement dynamiquement APP.config à l'exécution: une approche propre

Dans le développement d'applications, les modules chargés dynamiquement nécessitent souvent des ajustements au fichier app.config. Cependant, la modification directe du principal app.config est généralement évité en raison des conflits potentiels et de l'instabilité.

Le défi: ConfigurationManager et mise en cache

La classe ConfigurationManager et l'espace de noms System.Configuration utilisent la mise en cache. Cela signifie que les modifications apportées après la charge de configuration initiale peuvent ne pas prendre effet jusqu'à ce que l'application redémarre.

La solution: la classe AppConfig

La classe AppConfig suivante fournit une solution à ce problème. Il permet de modifier le app.config pour les modules d'exécution sans affecter le fichier d'origine.

<code class="language-csharp">public abstract class AppConfig : IDisposable
{
    public static AppConfig Change(string path)
    {
        return new ChangeAppConfig(path);
    }
    protected abstract void Dispose();
    private class ChangeAppConfig : AppConfig
    {
        private readonly string originalConfigPath =
            AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
        private bool disposedValue;
        public ChangeAppConfig(string path)
        {
            AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
            ResetConfiguration();
        }
        public override void Dispose()
        {
            if (!disposedValue)
            {
                AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", originalConfigPath);
                ResetConfiguration();
                disposedValue = true;
            }
            GC.SuppressFinalize(this);
        }
        private static void ResetConfiguration()
        {
            // Resetting internal ConfigurationManager state to reload config
            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>
Copier après la connexion

comment l'utiliser

<code class="language-csharp">// Temporary config modification
using (AppConfig.Change(temporaryConfigPath))
{
    // Access and use the modified configuration
}

// Permanent config modification (replace default)
AppConfig.Change(newConfigPath);</code>
Copier après la connexion

Avantages

Cette méthode offre un moyen propre et efficace de gérer la configuration pour les modules chargés dynamiquement. Il évite de modifier directement la valeur par défaut app.config, assurant la stabilité et la prévention des conflits. Son implémentation simple le rend adaptable à divers scénarios nécessitant des modifications de configuration d'exécution.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal