Como seleciono um arquivo de configuração do aplicativo .NET de um parâmetro de linha de comando?

StackOverflow https://stackoverflow.com/questions/163803

Pergunta

Eu gostaria de substituir o uso do App.config padrão, passando um parâmetro de linha de comando. Como altero o arquivo de configuração do aplicativo padrão para que, quando eu acessar o ConfigurationManager.AppSettings, estou acessando o arquivo de configuração especificado na linha de comando?

Editar:

Acontece que a maneira correta de carregar um arquivo de configuração que é diferente do nome do exe plus .config é usar o OpenMaPedExeconfiguration. Por exemplo

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Shell2.exe.config");
currentConfiguration = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

Isso funciona parcialmente. Eu posso ver todas as teclas na seção AppSettings, mas todos os valores são nulos.

Foi útil?

Solução

Então, aqui está o código que realmente me permite acessar a seção AppSettings em um arquivo de configuração que não seja o padrão.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Alternate.config");
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");
string MySetting = section.Settings["MySetting"].Value;

Outras dicas

Um arquivo em lote que copia o arquivo de configuração desejado para appname.exe.config e depois executa o appname.exe.

Eu precisava fazer isso também para um aplicativo meu, e lidar com os objetos de configuração padrão se transformou em um aborrecimento tão estranho para um conceito tão simples que eu segui nesta rota:

  1. Mantenha vários arquivos de configuração no formato XML semelhante ao app.config
  2. Carregar o arquivo de configuração especificado em um Conjunto de dados (via .readxml) e use o Tabela de dados com as informações de configuração nele como meu Objeto de configuração.
  3. Então, todo o meu código apenas lida com o Configuração DataTable Para recuperar valores e não esse objeto de configuração de aplicativos capptticamente ofuscado.

Então eu posso passar em qualquer nome de configuração que eu precise na linha de comando e se não estiver lá - basta carregar app.config no Conjunto de dados.

Jeezus foi muito mais simples depois disso. :-)

Ron

Esta é a parte relevante da fonte do aplicativo que usa a configuração padrão e aceita substituição via linha de comando:

Obtenha configuração atual ou de usuário no objeto de configuração

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
string defCfgName = Environment.GetCommandLineArgs()[0] + ".config";

if (arg.Length != 0)
{
    string ConfigFileName = arg[0];
    if (!File.Exists(ConfigFileName))
        Fatal("File doesn't exist: " + ConfigFileName, -1);                
    config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = ConfigFileName }, ConfigurationUserLevel.None);
}
else if (!File.Exists(defCfgName)) Fatal("Default configuration file doesn't exist and no override is set." , -1);

Use o objeto de configuração

AppSettingsSection s = (AppSettingsSection)config.GetSection("appSettings");
KeyValueConfigurationCollection a = s.Settings;
ConnectionString = a["ConnectionString"].Value;

Não é exatamente isso que você está querendo ... redirecionar o real ConfigurationManager Objeto estático para apontar para um caminho diferente. Mas acho que é a solução certa para o seu problema. Confira o OpenExeConfiguration Método no ConfigurationManager classe.

Se o método acima não é o que você está procurando, acho que também valeria a pena dar uma olhada no uso do Recursos de configuração da estrutura da biblioteca corporativa (desenvolvida e mantida pela equipe da Microsoft Patterns & Practices).

Especificamente dê uma olhada no FileConfigurationSource classe.

Aqui está algum código que destaca o uso do FileConfigurationSource a partir de Biblioteca Enterprise, Acredito que isso atinge totalmente seus objetivos. A única montagem de que você precisa do ENT Lib para isso é Microsoft.Practices.EnterpriseLibrary.Common.dll.

static void Main(string[] args)
{
    //read from current app.config as default
    AppSettingsSection ass = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings;

    //if args[0] is a valid file path assume it's a config for this example and attempt to load
    if (args.Length > 0 && File.Exists(args[0]))
    {
        //using FileConfigurationSource from Enterprise Library
        FileConfigurationSource fcs = new FileConfigurationSource(args[0]);
        ass = (AppSettingsSection) fcs.GetSection("appSettings");
    }

    //print value from configuration
    Console.WriteLine(ass.Settings["test"].Value);
    Console.ReadLine(); //pause
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top