Rumah >pembangunan bahagian belakang >C++ >Bagaimana cara mengubahsuai app.config secara dinamik pada masa runtime?

Bagaimana cara mengubahsuai app.config secara dinamik pada masa runtime?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-25 17:28:11950semak imbas

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

Ubah suai app.config lalai secara dinamik semasa masa jalan

Penerangan masalah:

Bangunkan penyelesaian yang memuatkan bahagian konfigurasi secara dinamik daripada modul aplikasi yang dimuatkan secara dinamik ke dalam app.config dalam memori baharu, memastikan aplikasi menggunakan konfigurasi yang diubah suai secara telus tanpa menulis ganti konfigurasi lalai.

Penyelesaian:

Soalan berkaitan mencadangkan menggunakan kaedah SetData untuk menukar laluan sistem konfigurasi, tetapi ini hanya berkesan apabila dilaksanakan sebelum sistem konfigurasi digunakan buat kali pertama. Untuk menyelesaikan isu ini sepenuhnya, nilai konfigurasi cache juga perlu dikosongkan.

Pelaksanaan:

Kod berikut menunjukkan cara untuk mencapai tingkah laku yang diingini:

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

Penggunaan:

Untuk mengubah suai app.config buat sementara waktu untuk skop tertentu:

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

Untuk menukar app.config secara kekal untuk keseluruhan masa jalan:

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

Atas ialah kandungan terperinci Bagaimana cara mengubahsuai app.config secara dinamik pada masa runtime?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn