[解決済み] 実行時にデフォルトのapp.configを変更する
質問
次のような問題があります。
私たちは、モジュール (アドオン) をロードするアプリケーションを持っています。これらのモジュールは、app.config (例: WCF 設定) のエントリを必要とする場合があります。モジュールは動的にロードされるため、アプリケーションの app.config ファイルにこれらのエントリを持ちたくはないのです。
私がしたいことは、次のとおりです。
- モジュールからの設定セクションを組み込んだ新しい app.config をメモリ内に作成する。
- この新しい app.config を使用するようにアプリケーションに指示する。
注意:デフォルトのapp.configを上書きしないようにしましょう
これは透過的に動作するはずで、例えば
ConfigurationManager.AppSettings
はその新しいファイルを使用します。
この問題の評価中に、私はここで提供されているのと同じ解決策を思いつきました。
nunitでapp.configを再読み込みする
.
残念ながら、通常のapp.configからデータを取得したままなので、何もしていないようです。
私はこのコードを使ってテストしました。
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
var combinedConfig = string.Format(CONFIG2, CONFIG);
var tempFileName = Path.GetTempFileName();
using (var writer = new StreamWriter(tempFileName))
{
writer.Write(combinedConfig);
}
using(AppConfig.Change(tempFileName))
{
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
}
同じ値を2回表示しますが
combinedConfig
には通常のapp.configとは異なる値が含まれていますが、同じ値が2回出力されます。
どのように解決するのですか?
リンク先の質問にあるハックは、設定システムを初めて使用する前に使用すれば動作します。それ以後は動作しません。
その理由は
クラスが存在し
ClientConfigPaths
というクラスがあり、これはパスをキャッシュしています。そのため、パスを変更しても
SetData
でパスを変更しても、すでにキャッシュされた値が存在するため、再読み込みはされません。解決策としては、これらも削除することです。
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);
}
}
}
使い方はこのようになります。
// the default app.config is used.
using(AppConfig.Change(tempFileName))
{
// the app.config in tempFileName is used
}
// the default app.config is used.
アプリケーションの実行時全体で使用するapp.configを変更したい場合は、単に
AppConfig.Change(tempFileName)
を、アプリケーションの開始位置のどこかでusingを使わずに記述します。
関連
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] .NETでapp.configやweb.configから設定を読み込む
-
[解決済み] Visual StudioでWebプロジェクトでないプロジェクトのApp.Config変換は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?