프레임 워크를 해킹하는 데 신경 쓰지 않고 응용 프로그램이 실행되는 .net 프레임 워크 버전 (예 : 웹 응용 프로그램 또는 인트라넷 응용 프로그램)을 가정하면 다음과 같이 시도 할 수 있습니다.
using System;
using System.Collections.Specialized;
using System.Configuration;
using System.Configuration.Internal;
using System.Reflection;
static class ConfigOverrideTest
{
sealed class ConfigProxy:IInternalConfigSystem
{
readonly IInternalConfigSystem baseconf;
public ConfigProxy(IInternalConfigSystem baseconf)
{
this.baseconf = baseconf;
}
object appsettings;
public object GetSection(string configKey)
{
if(configKey == "appSettings" && this.appsettings != null) return this.appsettings;
object o = baseconf.GetSection(configKey);
if(configKey == "appSettings" && o is NameValueCollection)
{
// create a new collection because the underlying collection is read-only
var cfg = new NameValueCollection((NameValueCollection)o);
// add or replace your settings
cfg["test"] = "Hello world";
o = this.appsettings = cfg;
}
return o;
}
public void RefreshConfig(string sectionName)
{
if(sectionName == "appSettings") appsettings = null;
baseconf.RefreshConfig(sectionName);
}
public bool SupportsUserConfig
{
get { return baseconf.SupportsUserConfig; }
}
}
static void Main()
{
// initialize the ConfigurationManager
object o = ConfigurationManager.AppSettings;
// hack your proxy IInternalConfigSystem into the ConfigurationManager
FieldInfo s_configSystem = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.Static | BindingFlags.NonPublic);
s_configSystem.SetValue(null, new ConfigProxy((IInternalConfigSystem)s_configSystem.GetValue(null)));
// test it
Console.WriteLine(ConfigurationManager.AppSettings["test"] == "Hello world" ? "Success!" : "Failure!");
}
}
사적인 반사 ... 매우 장난 꾸러기. –
.net 프레임 워크 버전은 위의 예와 특별히 관련이 있습니까? 즉 .... 내가 비슷한 예제를 시도하고 있지만 SetValue 값을 설정하는 것, 결국 구성 설정을 검색하려고하면 실패합니다 - 그래서, 어떤 경우 위의 코드가 작동하지 않을 수 있습니다? 감사합니다. –
's_configSystem' 비공개 필드는'ConfigurationManager'의 구현 세부 사항이며, 향후 프레임 워크 릴리스에서 변경 될 수도 있고 전혀 존재하지 않을 수도 있습니다 (예 : mono는 [configSystem] (https : // github. co.kr/mono/mono/blob/effa4c07ba850bedbe1ff54b2a5df281c058ebcb/mcs/class/System.Configuration/System.Configuration/ConfigurationManager.cs # L48)를 사용하십시오. –