Heim >Backend-Entwicklung >C++ >Wie ändere ich die Standard -App.config zur Laufzeit dynamisch?

Wie ändere ich die Standard -App.config zur Laufzeit dynamisch?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-25 17:28:11939Durchsuche

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

Ändern Sie die Standard-app.config während der Laufzeit dynamisch

Problembeschreibung:

Entwickeln Sie eine Lösung, die Konfigurationsabschnitte aus dynamisch geladenen Anwendungsmodulen dynamisch in eine neue In-Memory-App.config lädt und so sicherstellt, dass die Anwendung die geänderte Konfiguration transparent verwendet, ohne die Standard-App zu überschreiben.

Lösung:

Zugehörige Fragen schlagen vor, die Methode SetData zu verwenden, um den Konfigurationssystempfad zu ändern. Dies ist jedoch nur wirksam, wenn sie ausgeführt wird, bevor das Konfigurationssystem zum ersten Mal verwendet wird. Um dieses Problem vollständig zu beheben, müssen auch die zwischengespeicherten Konfigurationswerte gelöscht werden.

Umsetzung:

Der folgende Code zeigt, wie das gewünschte Verhalten erreicht wird:

<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>

Verwendung:

Um app.config vorübergehend für einen bestimmten Bereich zu ändern:

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

Um app.config für die gesamte Laufzeit dauerhaft zu ändern:

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

Das obige ist der detaillierte Inhalt vonWie ändere ich die Standard -App.config zur Laufzeit dynamisch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn