Я пытаюсь использовать файл конфигурации приложения по пути, отличному от пути запуска приложения.Я обнаружил, что могу изменить имя файла конфигурации с помощью:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename);
После этого некоторые методы работают правильно, например.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
загружает нужный файл, другие методы не работают, например.ConfigurationManager.GetSection("system.serviceModel/client")
не загружает раздел из файла.
Я нашел это, потому что мне нужно создавать службы или фабрики каналов, используя файл конфигурации.Запись:
channelFactory = new ChannelFactory<TContract>(EndpointConfigurationName);
У меня сбой, потому что, я полагаю, внутренний код использует метод GetSection.Я просмотрел приватные поля в классе ConfigurationManager и обнаружил, что экземпляр ClientConfigPaths имеет старое имя файла конфигурации в поле _applicationCongiUri, в то время как в статическом поле s_current указано правильное имя файла.Я использовал следующий код для правильного изменения значений 2 полей и этого wortk, загружая сервисы из нового файла конфигурации:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename);
FieldInfo field = typeof(ConfigurationManager).GetField("s_initLock", BindingFlags.Static | BindingFlags.NonPublic);
object lockobj = field.GetValue(null);
lock (lockobj)
{
typeof(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, 0);
}
field = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.Static | BindingFlags.NonPublic);
object s_configSystem = field.GetValue(null);
field = s_configSystem.GetType().GetField("_configHost", BindingFlags.Instance | BindingFlags.NonPublic);
object _configHost = field.GetValue(s_configSystem);
field = _configHost.GetType().GetField("_configPaths", BindingFlags.Instance | BindingFlags.NonPublic);
object _configPaths = field.GetValue(_configHost);
field = _configPaths.GetType().GetField("_applicationConfigUri", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(_configPaths, NewConfigFullFilename);
field = _configPaths.GetType().GetField("_localConfigFilename", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(_configPaths, NewConfigFullFilename);
Теперь я хотел бы знать, есть ли другие способысделать это, или если это ошибка, что AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE"
недостаточно, или любое другое предложение.
Спасибо