我使用了 sputnik 的答案,在一个 IIS 测试环境中工作得很好,但在另一个环境中却不行。事实证明,设置 APP_CONFIG_FILE 属性后,您可能需要使用反射来触摸 ConfigurationManager 类以使更改生效。我在设置 APP_CONFIG_FILE 属性后使用了这个函数:
private static void ResetConfiguration()
{
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);
}
除此之外,最好先保存属性,然后在完成后恢复它:
string oldConfigName = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
//do custom stuff in here
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfigName); //re-point to the original configuration.
ResetConfiguration();