在運行時更改默認(rèn)app.config我有以下問題:我們有一個加載模塊的應(yīng)用程序(添加ON)。這些模塊可能需要app.config中的條目(例如,WCF配置)。由于模塊是動態(tài)加載的,所以我不希望應(yīng)用程序的app.config文件中有這些條目。我想做的是:在內(nèi)存中創(chuàng)建一個新的app.config,它包含模塊中的配置部分告訴我的應(yīng)用程序使用那個新app.config注意:我不想覆蓋默認(rèn)app.config!它應(yīng)該透明地工作,例如ConfigurationManager.AppSettings使用那個新文件。在我評估這個問題時,我想出了與這里提供的相同的解決方案:用nunit重新加載app.config.不幸的是,它似乎什么也不做,因為我仍然從普通app.config獲取數(shù)據(jù)。我使用這個代碼來測試它: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);}它打印相同的值,盡管combinedConfig包含普通app.config以外的其他值。
3 回答

有只小跳蛙
TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊
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.
AppConfig.Change(tempFileName)
- 3 回答
- 0 關(guān)注
- 841 瀏覽
添加回答
舉報
0/150
提交
取消