none
Alterar caminho App.Config RRS feed

  • Pergunta

  • Boa tarde a todos,

    Existe a possibilidade de se alterar o caminho do App.config? Pois queria organizar os diretórios do meu sistema e gostaria de mover o App.config da raiz da aplicação para uma pasta específica.

    Abraço!
    quarta-feira, 17 de junho de 2009 18:31

Respostas

  • Olá Thyago,

    Pessoalmente, não acho uma boa idéia mudar o App.config de lugar, uma vez que você estará mudando uma convenção que todos os desenvolvedores já conhecem: O arquivo de configuração está sempre na mesma pasta do executável, com o nome do executável + extensão ".config".

    De qualquer forma, e respondendo sua pergunta, sim, é possível... Mas dá algum trabalho:

    O fato é que quando a primeira linha de código do seu programa é executada, você já está em um AppDomain criado pelo .NET, o App.config (se existir) já foi carregado nesse AppDomain, e a classe ConfigurationManager já está apontando para esse arquivo.

    Assim, para poder trocar o App.config de lugar, você teria que criar o seu próprio AppDomain, carregar o outro App.config nesse novo AppDomain, e executar (re-executar) sua aplicação nesse novo AppDomain.

    Para dar um exemplo, montei uma aplicação simples (Windows Forms) que funciona da seguinte forma:

    - Se ela for executada com o parâmetro "-appConfigCarregado", ela assume que o novo App.config já está no AppDomain, e executa normalmente
    - Se ela for executada sem o parâmetro "-appConfigCarregado", ela se encarrega de criar o novo AppDomain, carregar o novo App.config e então re-executar a aplicação nesse AppDomain.

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        bool appConfigCarregado = args.Length > 0 && args[0].Equals("-appConfigCarregado");
    
        // O arquivo de configuração ainda não foi carregado?
        if (!appConfigCarregado)
        {
            // Não... Então vamos carregá-lo, e reiniciar a aplicação.
    
            // Define um novo AppDomain onde a aplicação será executada
            // com o arquivo de configuração customizado (em outro path)
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationBase = Path.Combine("file://", Environment.CurrentDirectory);
            setup.DisallowBindingRedirects = true;
            setup.DisallowCodeDownload = true;
            
            // Define o caminho do seu novo App.config
            setup.ConfigurationFile = @"C:\NovoCaminhoDoAppConfig\App.config";
            
            // Cria o novo AppDomain com as definições acima
            AppDomain domain = AppDomain.CreateDomain("NOME_DO_SEU_DOMINIO", null, setup);
            
            // Reinicia a aplicação, mas no novo AppDomain, e consequentemente,
            // com o novo arquivo de configuração carregado...
            domain.ExecuteAssembly(Application.ExecutablePath, null, 
                new string[] {"-appConfigCarregado"});
    
            // Termina essa instância da aplicação
            return;
        }
    
        // Continua a execução normal da aplicação
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    


    Abraços,
    Caio Proiete



    Caio Proiete Siga-me no Twitter!
    http://www.caioproiete.com
    domingo, 28 de junho de 2009 13:44
    Moderador

Todas as Respostas

  • Olá Thyago,

    Pessoalmente, não acho uma boa idéia mudar o App.config de lugar, uma vez que você estará mudando uma convenção que todos os desenvolvedores já conhecem: O arquivo de configuração está sempre na mesma pasta do executável, com o nome do executável + extensão ".config".

    De qualquer forma, e respondendo sua pergunta, sim, é possível... Mas dá algum trabalho:

    O fato é que quando a primeira linha de código do seu programa é executada, você já está em um AppDomain criado pelo .NET, o App.config (se existir) já foi carregado nesse AppDomain, e a classe ConfigurationManager já está apontando para esse arquivo.

    Assim, para poder trocar o App.config de lugar, você teria que criar o seu próprio AppDomain, carregar o outro App.config nesse novo AppDomain, e executar (re-executar) sua aplicação nesse novo AppDomain.

    Para dar um exemplo, montei uma aplicação simples (Windows Forms) que funciona da seguinte forma:

    - Se ela for executada com o parâmetro "-appConfigCarregado", ela assume que o novo App.config já está no AppDomain, e executa normalmente
    - Se ela for executada sem o parâmetro "-appConfigCarregado", ela se encarrega de criar o novo AppDomain, carregar o novo App.config e então re-executar a aplicação nesse AppDomain.

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        bool appConfigCarregado = args.Length > 0 && args[0].Equals("-appConfigCarregado");
    
        // O arquivo de configuração ainda não foi carregado?
        if (!appConfigCarregado)
        {
            // Não... Então vamos carregá-lo, e reiniciar a aplicação.
    
            // Define um novo AppDomain onde a aplicação será executada
            // com o arquivo de configuração customizado (em outro path)
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationBase = Path.Combine("file://", Environment.CurrentDirectory);
            setup.DisallowBindingRedirects = true;
            setup.DisallowCodeDownload = true;
            
            // Define o caminho do seu novo App.config
            setup.ConfigurationFile = @"C:\NovoCaminhoDoAppConfig\App.config";
            
            // Cria o novo AppDomain com as definições acima
            AppDomain domain = AppDomain.CreateDomain("NOME_DO_SEU_DOMINIO", null, setup);
            
            // Reinicia a aplicação, mas no novo AppDomain, e consequentemente,
            // com o novo arquivo de configuração carregado...
            domain.ExecuteAssembly(Application.ExecutablePath, null, 
                new string[] {"-appConfigCarregado"});
    
            // Termina essa instância da aplicação
            return;
        }
    
        // Continua a execução normal da aplicação
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    


    Abraços,
    Caio Proiete



    Caio Proiete Siga-me no Twitter!
    http://www.caioproiete.com
    domingo, 28 de junho de 2009 13:44
    Moderador
  • Bom dia Caio,

    Muito obrigado, ajudou bastante!

    Abraço.

    Thyago.
    quarta-feira, 1 de julho de 2009 12:08