Usuário com melhor resposta
Erro ao ler App.Config

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;
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
-
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
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/ -
-
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/ -
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) }
-
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
-
-
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/ -
é 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;
-
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
-
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
-
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
-