Maison > développement back-end > C++ > Comment modifier dynamiquement le fichier app.config par défaut au moment de l'exécution ?

Comment modifier dynamiquement le fichier app.config par défaut au moment de l'exécution ?

Mary-Kate Olsen
Libérer: 2025-01-25 17:28:11
original
912 Les gens l'ont consulté

How to Dynamically Modify the Default app.config at Runtime?

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>
Copier après la connexion

Utilisation :

Pour modifier temporairement app.config pour une portée spécifique :

<code class="language-csharp">using (AppConfig.Change(tempFileName))
{
    // 应用程序使用修改后的 app.config
}</code>
Copier après la connexion

Pour modifier définitivement app.config pour tout le runtime :

<code class="language-csharp">// 应用程序使用修改后的 app.config
AppConfig.Change(tempFileName);</code>
Copier après la connexion

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