Eu tenho o seguinte problema:
Temos um aplicativo que carrega módulos (complementos). Esses módulos podem precisar de entradas no app.config (por exemplo, configuração do WCF). Como os módulos são carregados dinamicamente, não quero ter essas entradas no arquivo app.config do meu aplicativo.
O que eu gostaria de fazer é o seguinte:
- Crie um novo app.config na memória que incorpore as seções de configuração dos módulos
- Diga ao meu aplicativo para usar esse novo app.config
Nota: Não quero substituir o app.config padrão!
Deve funcionar de forma transparente, de modo que, por exemplo ConfigurationManager.AppSettings
use esse novo arquivo.
Durante minha avaliação desse problema, eu vim com a mesma solução que é fornecida aqui: Recarregue app.config com nunit .
Infelizmente, ele parece não fazer nada, porque ainda recebo os dados do app.config normal.
Eu usei esse código para testá-lo:
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);
}
Ele imprime os mesmos valores duas vezes, embora combinedConfig
contenha outros valores além do app.config normal.
fonte
AppDomain
com o arquivo de configuração apropriado não é uma opção?Reload app.config with nunit
pode funcionar, não tenho certeza, se usada na entrada do aplicativo antes de qualquer configuração ser carregada.Respostas:
O hack na pergunta vinculada funciona se for usado antes que o sistema de configuração seja usado pela primeira vez. Depois disso, não funciona mais.
O motivo:
existe uma classe
ClientConfigPaths
que armazena em cache os caminhos. Portanto, mesmo depois de alterar o caminho comSetData
, ele não é relido, porque já existem valores em cache. A solução é removê-los também:O uso é assim:
Se você deseja alterar o app.config usado durante todo o tempo de execução do seu aplicativo, basta colocá-lo
AppConfig.Change(tempFileName)
sem o uso em algum lugar no início do seu aplicativo.fonte
Você pode tentar usar Configuration e Add ConfigurationSection no tempo de execução
EDIT: Aqui está a solução baseada na reflexão (embora não seja muito agradável)
Criar classe derivada de
IInternalConfigSystem
depois, através da reflexão, defina-o como campo privado em
ConfigurationManager
fonte
file_path
. Isso não tornará a seção disponível para os usuários deConfigurationManager.GetSection
, porqueGetSection
usa o app.config padrão.A solução @Daniel funciona bem. Uma solução semelhante com mais explicações está no canto c-sharp. Para completar, gostaria de compartilhar minha versão: with
using
, e os sinalizadores de bits abreviados.fonte
Se alguém estiver interessado, aqui está um método que funciona no Mono.
fonte
A solução de Daniel parece funcionar mesmo para montagens a jusante que eu havia usado o AppDomain.SetData antes, mas não sabia como redefinir os sinalizadores de configuração internos
Convertido em C ++ / CLI para os interessados
fonte
Se o seu arquivo de configuração foi gravado com chave / valores em "appSettings", você pode ler outro arquivo com esse código:
Em seguida, você pode ler section.Settings como coleção de KeyValueConfigurationElement.
fonte
ConfigurationManager.GetSection
ler o novo arquivo que criei. Sua solução não faz isso.ConfigurationManager.GetSection
usa o app.config padrão. Ele não se importa com o arquivo de configuração que você abriuOpenMappedExeConfiguration
.Maravilhosa discussão, adicionei mais comentários ao método ResetConfigMechanism para entender a mágica por trás da declaração / chamadas no método. Também existe verificação de caminho do arquivo adicionado
fonte
Daniel, se possível, tente usar outros mecanismos de configuração. Passamos por essa rota em que tínhamos arquivos de configuração estáticos / dinâmicos diferentes, dependendo do ambiente / perfil / grupo, e isso ficou bastante confuso no final.
você pode experimentar algum tipo de perfil WebService no qual especifica apenas uma URL de serviço da Web do cliente e, dependendo dos detalhes do cliente (você pode ter substituições no nível de grupo / usuário), ele carrega toda a configuração necessária. Também usamos a MS Enterprise Library para alguma parte dela.
ou seja, você não implanta a configuração com o seu cliente e pode gerenciá-lo separadamente dos seus clientes
fonte