AppSettings obtém valor do arquivo .config

172

Não consigo acessar valores no arquivo de configuração.

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var clientsFilePath = config.AppSettings.Settings["ClientsFilePath"].Value; 
// the second line gets a NullReferenceException

arquivo .config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- ... -->
    <add key="ClientsFilePath" value="filepath"/>
    <!-- ... -->
  </appSettings>
</configuration>

Você tem alguma sugestão do que devo fazer?

Matt
fonte

Respostas:

345

Isso funciona para mim:

string value = System.Configuration.ConfigurationManager.AppSettings[key];
Adão
fonte
6
O código fornecido fornece que o arquivo YourProgram.exe.config exista na mesma pasta que YourProgram.exe. Apenas verifique se está lá. Um erro comum é copiar o arquivo app.config para o diretório de destino, o que não funcionará.
26412 Adam
40
Exigir adicionar referência System.Configuration.
checksum
13
Meu .NET 4.5 System.Configuration não temConfigurationManager
qwert_ukg 04/04
3
Também estou recebendo um nulo em um projeto 4.5 - gastei duas horas nisso ... Tem que ser um bug.
IrishChieftain 7/01/19
1
Eu também estou vendo isso em um aplicativo de vários destinos, minha configuração de núcleo .net funciona, mas a configuração de estrutura .net não funciona (usando o ConfigurationManager)
Michael Brown
61

A resposta que dtsg deu obras:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

MAS, você precisa adicionar uma referência de montagem a

Configuração do sistema

Vá para o seu Solution Explorer e clique direito em References e selecione Add Reference . Selecione a guia Assemblies e procure por Configuration .

Gerente de referência

Aqui está um exemplo do meu App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="AdminName" value="My Name"/>
    <add key="AdminEMail" value="MyEMailAddress"/>
  </appSettings>
</configuration>

Que você pode obter da seguinte maneira:

string adminName = ConfigurationManager.AppSettings["AdminName"];
rotgers
fonte
2
Parece que tenho o mesmo problema do OP. Usando o VS2015. Não sei como ou por quê, mas minha referência ao System.Configuration diz System.configuration (em minúsculas).
Tim
Isso pode ser feito com a expansão para cobrir onde não há uma guia "assemblies" (pelo menos VS2019)
SomeoneElse
21

Experimente:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
dtsg
fonte
4
Sua implementação deve estar incorreta. Definitivamente, isso funciona para recuperar valores-chave de um arquivo de configuração.
Dtsg 26/05
Certifique-se de adicionar uma referência ao System.Configuration nas referências do seu projeto!
GrahamJ
19

Read From Config:

Você precisará adicionar uma referência ao Config

  1. Abra "Propriedades" no seu projeto
  2. Vá para a guia "Configurações"
  3. Adicione "Nome" e "Valor"
  4. Obtenha valor usando o seguinte código:
string value = Properties.Settings.Default.keyname;

Salvar na configuração:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Masoud Siahkali
fonte
4
Realmente útil, pois todas as outras respostas usando o ConfigurationManager não funcionam se você adicionar seus valores nas guias Configurações das propriedades do projeto, conforme descrito. Obrigado.
The Dumb Radish
2
Isso funcionou para mim também. Eu estava recebendo uma nullsequência com as recomendações acima, mas Properties.Settings.Default.<keyName>funcionou como um encanto!
dub stylee
1
Perfeito! Eu estava procurando por isso :) Obrigado!
HSQL 10/09/19
@Masoud Siahkali, Na semana passada, tentei praticamente o que você tem aqui em meu próprio projeto, mas os valores, quando alterados pelo usuário em tempo de execução (apenas executá-lo a partir da GUI do VS por enquanto) não persistem entre instâncias. Minha pergunta: stackoverflow.com/questions/61018443/… . Ainda não entendi por que as configurações alteradas pelo usuário desses valores não persistem ...
marky 5/04
8

Estou usando:

    ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
    //configMap.ExeConfigFilename = @"d:\test\justAConfigFile.config.whateverYouLikeExtension";
    configMap.ExeConfigFilename = AppDomain.CurrentDomain.BaseDirectory + ServiceConstants.FILE_SETTING;
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
    value1 = System.Configuration.ConfigurationManager.AppSettings["NewKey0"];
    value2 = config.AppSettings.Settings["NewKey0"].Value;
    value3 = ConfigurationManager.AppSettings["NewKey0"];

Onde valor1 = ... e valor3 = ... fornece nulo e valor2 = ... funciona

Decidi substituir o app.config interno por:

// Note works in service but not in wpf
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"d:\test\justAConfigFile.config.whateverYouLikeExtension");
ConfigurationManager.RefreshSection("appSettings");

string value = ConfigurationManager.AppSettings["NewKey0"];

Usando o VS2012 .net 4

Kkloe
fonte
Isto é exatamente o que eu precisava. Realmente útil, obrigado.
Umut OVECOGLU
5

No app/web.configarquivo, defina a seguinte configuração:

<configuration>
  <appSettings>
    <add key="NameForTheKey" value="ValueForThisKey" />
    ... 
    ...    
  </appSettings>
...
...
</configuration>

então você pode acessar isso no seu código colocando esta linha:

string myVar = System.Configuration.ConfigurationManager.AppSettings["NameForTheKey"];

* Observe que este trabalho é bom para .net4.5.xe .net4.6.x; mas não trabalha para .net core. Atenciosamente: Rafael

Rafael Andrs Cspedes Basterio
fonte
3

Voltando a este depois de muito tempo ...

Dado o fim do ConfigurationManager, para quem ainda procura uma resposta para esta tentativa (por exemplo):

AppSettingsReader appsettingsreader = new AppSettingsReader();
string timeAsString = (string)(new AppSettingsReader().GetValue("Service.Instance.Trigger.Time", typeof(string)));

Requer System.Configuration of course.

(Editou o código para algo que realmente funciona e é mais simples de ler)

Mike Dean
fonte
Boa resposta, mas limpe, por que criar uma nova instância do AppSettingsReader quando você recriar o AppSettingsReader novamente e não precisar converter a string, basta encerrá-la para substituir .ToString ().
maytham-ɯɐɥʇʎɐɯ
2

Veja, eu fiz o que achei que era óbvio:

string filePath = ConfigurationManager.AppSettings.GetValues("ClientsFilePath").ToString();

Enquanto isso compila, sempre retorna nulo.

No entanto (acima) funciona:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
Steve
fonte
2

Algumas das respostas parecem um pouco fora da OMI. Aqui está minha opinião por volta de 2016

<add key="ClientsFilePath" value="filepath"/>

Verifique se System.Configurationestá referenciado.

A pergunta está pedindo o valor de uma chave appsettings

O que certamente deve ser

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Aqui está uma reviravolta na qual você pode agrupar valores (não para esta pergunta)

var emails = ConfigurationManager.AppSettings[ConfigurationManager.AppSettings["Environment"] + "_Emails"];

emails será o valor da chave do ambiente + "_Emails"

example :   jack@google.com;thad@google.com;
Tom Stickel
fonte
2

Para aplicativos da web, normalmente escrevo esse método e chamo apenas com a tecla

private String GetConfigValue(String key)
    {
       return System.Web.Configuration.WebConfigurationManager.AppSettings[key].ToString();
    }
suulisina
fonte
1

Você pode simplesmente digitar:

string filePath = Sysem.Configuration.ConfigurationManager.AppSettings[key.ToString()];

porque keyé um objeto e AppSettingspega uma string

Soprano
fonte
1
ConfigurationManager.RefreshSection("appSettings")
string value = System.Configuration.ConfigurationManager.AppSettings[key];
musicinmusic
fonte
1

Ou você pode usar

string value = system.configuration.ConfigurationManager.AppSettings.Get("ClientsFilePath");

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection
Davit Mikuchadze
fonte
0

Meu teste simples também falhou, seguindo o conselho das outras respostas aqui - até que eu percebi que o arquivo de configuração que adicionei ao meu aplicativo de desktop recebeu o nome "App1.config". Eu mudei o nome para "App.config" e tudo imediatamente funcionou como deveria.

BCA
fonte
0
  1. Abra "Propriedades" no seu projeto
  2. Vá para a guia "Configurações"
  3. Adicione "Nome" e "Valor"

O CÓDIGO SERÁ GERADO AUTOMATICAMENTE

    <configuration>
      <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup ..." ... >
          <section name="XX....Properties.Settings" type="System.Configuration.ClientSettingsSection ..." ... />
        </sectionGroup>
      </configSections>
      <applicationSettings>
        <XX....Properties.Settings>
          <setting name="name" serializeAs="String">
            <value>value</value>
          </setting>
          <setting name="name2" serializeAs="String">
            <value>value2</value>
          </setting>
       </XX....Properties.Settings>
      </applicationSettings>
    </configuration>

Para obter um valor

Properties.Settings.Default.Name

OU

Properties.Settings.Default ["name"]

Hakan
fonte