У меня следующая проблема: у
нас есть приложение, которое загружает модули (надстройки). Этим модулям могут потребоваться записи в app.config (например, конфигурация WCF). Поскольку модули загружаются динамически, я не хочу, чтобы эти записи были в файле app.config моего приложения.
Я бы хотел сделать следующее:
- Создайте новый app.config в памяти, который включает разделы конфигурации из модулей
- Скажите моему приложению использовать этот новый app.config
Примечание: я не хочу перезаписывать app.config по умолчанию!
Он должен работать прозрачно, чтобы, например, ConfigurationManager.AppSettings
использовать этот новый файл.
Во время оценки этой проблемы я пришел к тому же решению, что и здесь: перезагрузите app.config с помощью nunit .
К сожалению, похоже, что он ничего не делает, потому что я все еще получаю данные из обычного 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);
}
Он печатает одни и те же значения дважды, но combinedConfig
содержит другие значения, чем обычный app.config.
источник
AppDomain
с соответствующим файлом конфигурации не вариант?Reload app.config with nunit
мог бы сработать, не уверен, если использовать его при входе в приложение до загрузки какой-либо конфигурации.Ответы:
Взлом в связанном вопросе работает, если он используется до первого использования системы конфигурации. После этого больше не работает.
Причина:
существует класс,
ClientConfigPaths
который кэширует пути. Таким образом, даже после изменения пути с помощьюSetData
, он не перечитывается, потому что уже существуют кешированные значения. Решение состоит в том, чтобы удалить и их:Использование это так:
Если вы хотите изменить используемый app.config для всего времени выполнения вашего приложения, просто поместите
AppConfig.Change(tempFileName)
без использования где-нибудь в начале вашего приложения.источник
Вы можете попробовать использовать Configuration и добавить ConfigurationSection во время выполнения
РЕДАКТИРОВАТЬ: вот решение, основанное на отражении (хотя и не очень хорошее)
Создать класс, производный от
IInternalConfigSystem
затем через отражение установите его в частное поле в
ConfigurationManager
источник
file_path
. Это не сделает этот раздел доступным для пользователейConfigurationManager.GetSection
, посколькуGetSection
по умолчанию используется app.config.Решение @Daniel работает нормально. Аналогичное решение с дополнительными пояснениями находится в остром углу. Для полноты картины хочу поделиться своей версией: с
using
, а битовые флаги сокращены.источник
Если кому-то интересно, вот метод, который работает на Mono.
источник
Решение Даниэля, похоже, работает даже для последующих сборок, которые я использовал ранее AppDomain.SetData, но не знал, как сбросить внутренние флаги конфигурации
Конвертирован в C ++ / CLI для заинтересованных
источник
Если ваш файл конфигурации просто записан с ключами / значениями в "appSettings", вы можете прочитать другой файл с таким кодом:
Затем вы можете прочитать section.Settings как коллекцию KeyValueConfigurationElement.
источник
ConfigurationManager.GetSection
прочитать созданный мной новый файл. Ваше решение этого не делает.ConfigurationManager.GetSection
используется app.config по умолчанию. Его не волнует файл конфигурации, который вы открылиOpenMappedExeConfiguration
.Замечательное обсуждение, я добавил больше комментариев к методу ResetConfigMechanism, чтобы понять магию, стоящую за оператором / вызовами в методе. Также добавлена проверка наличия пути к файлу
источник
Даниэль, если возможно, попробуйте использовать другие механизмы конфигурации. Мы прошли этот путь, где у нас были разные статические / динамические файлы конфигурации в зависимости от среды / профиля / группы, и в конце он стал довольно беспорядочным.
вы можете попробовать какой-то профиль WebService, где вы указываете только один URL-адрес веб-службы от клиента и в зависимости от деталей клиента (у вас могут быть переопределения на уровне группы / пользователя), он загружает всю необходимую конфигурацию. Мы также использовали библиотеку MS Enterprise для некоторой ее части.
это было то, что вы не развертывали конфигурацию со своим клиентом, и вы можете управлять ею отдельно от своих клиентов
источник