ホームページ > バックエンド開発 > C++ > 実行時にデフォルトのapp.configを動的に変更する方法は?

実行時にデフォルトのapp.configを動的に変更する方法は?

Mary-Kate Olsen
リリース: 2025-01-25 17:28:11
オリジナル
912 人が閲覧しました

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

デフォルトのapp.configを動的に変更します

問題の説明:

動的にロードされたアプリケーションモジュールから新しいメモリApp.configに動的にロードできるソリューションを開発し、デフォルトのアプリをカバーせずに、アプリケーションが変更された構成に透過的であることを確認します。

解決策:

関連する問題は、メソッドを使用して構成システムパスを変更することをお勧めしますが、これは、構成システムが最初に最初に使用される場合にのみ有効です。この問題を完全に解決するには、キャッシュ構成値もクリアする必要があります。

実装:

SetData

必要な動作を達成する方法の次のコードデモンストレーション:

の使用方法:

app.configの特定の範囲を一時的に変更するには:
<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>
ログイン後にコピー

ランタイム全体でapp.configを永続的に変更する

以上が実行時にデフォルトのapp.configを動的に変更する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート