none
Erro ao ler App.Config RRS feed

  • Pergunta

  • Pessoal, no método Install do meu windowsservice, preciso abrir as configurações para poder associar valores a algumas keys..

    O arquivo está corretamente no diretório, porém ao tentar ler sempre dá o erro:

    Reference not set to an Instance of an Object...

    E as chaves existem corretamente.. pq será?

    <configuration>
      <appSettings>
        <add key="CaminhoArquivosExcel" value="testeeeee"/>
        <add key="CaminhoArquivosExcelProcessados" value=""/>
      </appSettings>
    </configuration>
    
    
    ---
    Configuration config = ConfigurationManager.OpenExeConfiguration(appConfigPath);
    string valor = config.AppSettings.Settings["CaminhoArquivosExcel"].Value;
    


    quinta-feira, 1 de dezembro de 2011 13:24

Respostas

  • Não sei se você tentou usar o ConfigurationManager.AppSettings[""] para ler esse seu .config, mais pelo que eu vi você passa o caminho do .config de forma dinamicamente, o método OpenExeConfiguration só aceita caminho de executaveis, mais você esta passando um caminho de um arquivo .config, imagine que ele vai ler o .config do .exe que você passar para o método.

    Tente ler seu .config desta maneira:


    //Lendo .config
    var xDoc = System.Xml.Linq.XDocument.Load(appConfigPath);
    
    //Recuperando todas as tag "add" e verifica se os seus atributos, caso tenha retorna o valor
    string valor = (from x in xDoc.Descendants("add")
                    where x.Attribute("key").Value == "CaminhoArquivosExcel"
                    select x.Attribute("value").Value).FirstOrDefault();
    

    Referencia:
    http://msdn.microsoft.com/pt-br/library/ms224437.aspx 
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    • Editado Vitor Mendes quinta-feira, 1 de dezembro de 2011 14:31
    • Marcado como Resposta .NET Dev quinta-feira, 1 de dezembro de 2011 16:06
    quinta-feira, 1 de dezembro de 2011 14:29
  • Tente exibir os valores do XElement  assim:

    MessageBox.Show(xElementProcessar.Attribute("value").Value);
    MessageBox.Show(xElementProcessados.Attribute("value").Value);
    

    E apos alterar os valores, use o método .Save(Caminho do arquivo) para salvar a alteração do arquivo .config

    Exemplo:
    //Salvando alteração
    xDoc.Save(appConfigPath);
    

     
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    • Marcado como Resposta .NET Dev quinta-feira, 1 de dezembro de 2011 18:05
    quinta-feira, 1 de dezembro de 2011 17:48

Todas as Respostas

  • As vezes acontece de alguns métodos que retorna o caminho de onde esta rodando a aplicação,nao retorna corretamente, pois ele assume o caminho local de onde esta rodando, veja se o caminho desta variavel appConfigPath esta vindo corretamente.

    Qual foi a caminho que você passou para esta variavel:
    appConfigPath 


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    quinta-feira, 1 de dezembro de 2011 13:42
  • Então o diretório que é associado é o diretório de instalação do WindowsService -- exemplo C:\Program Files\Projeto\WindowsService.exe.config  ..  Está correto..  Por isso acho estranho
    quinta-feira, 1 de dezembro de 2011 13:47
  • Entao, mais como você esta pegando esse diretorio ?? deixou em uma string fixa ou esta usando de algum método para auxiliar isso ??
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    quinta-feira, 1 de dezembro de 2011 13:50
  • Pego assim:

     public override void Install(System.Collections.IDictionary stateSaver)
            {
                base.Install(stateSaver);
    
                string strTargetDir = Context.Parameters["targetdir"];
                string strTargetNew = strTargetDir.Replace(@"\\",@"\");
    
                string param1 = Context.Parameters["CaminhoArquivosExcel"];
    
                string param2 = Context.Parameters["CaminhoArquivosExcelProcessados"];
    
                string exePath = string.Format("{0}Proex.WindowsService.exe", strTargetNew);
    
                MessageBox.Show(exePath);
    
                string appConfigPath = exePath + ".config";
                MessageBox.Show(appConfigPath);
    
                Configuration config = ConfigurationManager.OpenExeConfiguration(appConfigPath);
    
     string valor = config.AppSettings.Settings["CaminhoArquivosExcel"].Value;  // (erro)
    
    }
    


    quinta-feira, 1 de dezembro de 2011 13:54
  • Não sei se você tentou usar o ConfigurationManager.AppSettings[""] para ler esse seu .config, mais pelo que eu vi você passa o caminho do .config de forma dinamicamente, o método OpenExeConfiguration só aceita caminho de executaveis, mais você esta passando um caminho de um arquivo .config, imagine que ele vai ler o .config do .exe que você passar para o método.

    Tente ler seu .config desta maneira:


    //Lendo .config
    var xDoc = System.Xml.Linq.XDocument.Load(appConfigPath);
    
    //Recuperando todas as tag "add" e verifica se os seus atributos, caso tenha retorna o valor
    string valor = (from x in xDoc.Descendants("add")
                    where x.Attribute("key").Value == "CaminhoArquivosExcel"
                    select x.Attribute("value").Value).FirstOrDefault();
    

    Referencia:
    http://msdn.microsoft.com/pt-br/library/ms224437.aspx 
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    • Editado Vitor Mendes quinta-feira, 1 de dezembro de 2011 14:31
    • Marcado como Resposta .NET Dev quinta-feira, 1 de dezembro de 2011 16:06
    quinta-feira, 1 de dezembro de 2011 14:29
  • Realmente Vitor, funcionou desta maneira... MAS como posso agora atribuir o value para essa Key dessa forma ? obrigado
    • Editado .NET Dev quinta-feira, 1 de dezembro de 2011 15:44
    quinta-feira, 1 de dezembro de 2011 15:44
  • Realmente Vitor, funcionou desta maneira... MAS como posso agora atribuir o value para essa Key dessa forma ? obrigado
    Você diz no caso qual seria o código para alterar apenas o value destar key ou para criar uma estrutura XML semelhante ao do app.config ??
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    quinta-feira, 1 de dezembro de 2011 15:49
  • é pq nesse método Install, terei que alterar de acordo com os params, as chaves do app.config.. por exemplo:

     reader.AppSettings.Settings["CaminhoArquivosExcel"].Value = param1;
    
                reader.AppSettings.Settings["CaminhoArquivosExcelProcessados"].Value = param2;
    


    quinta-feira, 1 de dezembro de 2011 15:54
  • Achei uma maneira mais facil, importe o namespace System.Xml.XPath e tente usar desta maneira.

    //Lendo arquivo
    var xDoc = System.Xml.Linq.XDocument.Load(appConfigPath);
    
    //Recuperando valor
    string valor = xDoc.XPathSelectElement("configuration/appSettings/add[@key = 'CaminhoArquivosExcel']").Value;
    
    //Alterando valor
    XElement xElement = xDoc.XPathSelectElement("configuration/appSettings/add[@key = 'CaminhoArquivosExcel']");
    xElement.Attribute("value").Value = "teste";
    
    //Salvando alteração
    xDoc.Save(appConfigPath);
    

     
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    • Editado Vitor Mendes quinta-feira, 1 de dezembro de 2011 16:09
    quinta-feira, 1 de dezembro de 2011 16:08
  • Vítor, fiz como me passou, mas não me retorna nada (se fizer a inserção manual de valores nas keys e fazer messagebox por exemplo...) e tb nao atribui os valores nas keys.. o q pode estar faltando?

     

    var xDoc = System.Xml.Linq.XDocument.Load(appConfigPath);
               
                string strKeyProcessar   = xDoc.XPathSelectElement("configuration/appSettings/add[@key = 'CaminhoArquivosExcel']").Value;
                string strKeyProcessados = xDoc.XPathSelectElement("configuration/appSettings/add[@key = 'CaminhoArquivosExcelProcessados']").Value;
               
                XElement xElementProcessar   = xDoc.XPathSelectElement("configuration/appSettings/add[@key = 'CaminhoArquivosExcel']");
                XElement xElementProcessados = xDoc.XPathSelectElement("configuration/appSettings/add[@key = 'CaminhoArquivosExcelProcessados']");
    
                MessageBox.Show(xElementProcessar.Value);
                MessageBox.Show(xElementProcessados.Value);
    
                xElementProcessar.Attribute("CaminhoArquivosExcel").Value   = param1;
                xElementProcessados.Attribute("CaminhoArquivosExcelProcessados").Value = param2;
    

    Ao deixar acima como está, está dando erro -- Object Reference not set to an Instance of object....  Acho que ainda não está reconhecendo assim.. Pelo método anterior q tinha me passado - linq .. ai ele conseguiu lerr o conteudo do arquivo..

     


    • Editado .NET Dev quinta-feira, 1 de dezembro de 2011 17:50
    quinta-feira, 1 de dezembro de 2011 17:35
  • Tente exibir os valores do XElement  assim:

    MessageBox.Show(xElementProcessar.Attribute("value").Value);
    MessageBox.Show(xElementProcessados.Attribute("value").Value);
    

    E apos alterar os valores, use o método .Save(Caminho do arquivo) para salvar a alteração do arquivo .config

    Exemplo:
    //Salvando alteração
    xDoc.Save(appConfigPath);
    

     
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    • Marcado como Resposta .NET Dev quinta-feira, 1 de dezembro de 2011 18:05
    quinta-feira, 1 de dezembro de 2011 17:48
  • É isso ai Vítor,  deu certo.. Obrigado
    quinta-feira, 1 de dezembro de 2011 18:05