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
Freigeben: 2025-01-25 17:28:11
Original
912 Leute haben es durchsucht

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>
Nach dem Login kopieren

Verwendung:

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

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

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

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

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage