Lendo configurações de app.config ou web.config no .NET

807

Estou trabalhando em uma biblioteca de classes C # que precisa ser capaz de ler as configurações do arquivo web.configou app.config(dependendo se a DLL é referenciada em um aplicativo Web do ASP.NET ou em um aplicativo do Windows Forms).

Eu descobri isso

ConfigurationSettings.AppSettings.Get("MySetting")

funciona, mas esse código foi marcado como reprovado pela Microsoft.

Eu li que eu deveria estar usando:

ConfigurationManager.AppSettings["MySetting"]

No entanto, a System.Configuration.ConfigurationManagerclasse não parece estar disponível em um projeto da Biblioteca de Classes em C #.

Qual é a melhor maneira de fazer isso?

Russ Clark
fonte
48
Como eu li 4 exemplos e artigos do MSDN. E chegou aqui. Basta adicionar uma referência .. por que eles não podem simplesmente dizer isso. Boa pergunta! +1
Piotr Kula
1
Se você quiser escrever as configurações novamente , veja aqui como fazê-lo.
Matt

Respostas:

798

Você precisará adicionar uma referência ao System.Configurationno de seu projeto pasta referências .

Você definitivamente deveria estar usando ConfigurationManagero obsoleto ConfigurationSettings.

womp
fonte
Muito obrigado! resposta muito direta. Eu estava criando um aplicativo de console! e esta resposta salve o dia!
PatsonLeaner
1
Isso ainda é preciso para o núcleo .net.
Triynko 5/03
868

Para um arquivo app.config de exemplo, como abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

Você leu as configurações do aplicativo acima usando o código mostrado abaixo:

using System.Configuration;

Você também pode precisar adicionar uma referência ao System.Configurationseu projeto, se ainda não houver uma. Você pode acessar os valores da seguinte maneira:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
RAM
fonte
124
Eu gosto mais da sua resposta do que da resposta aceita. Respostas com exemplos sempre fazem o truque para mim.
Brendan Vogt
Isso funcionou para mim. No entanto, meu System.Configuration não contém um ConfigurationManager, então tive que usar o ConfigurationSettings. Ironicamente, eu ainda recebi um aviso de que era obsoleto.
Nightmare Games
13
Isso aconteceu comigo também. Você tentou adicionar a referência System.Configuration? O problema é que o VS engana você, fazendo você pensar que realmente o tem; você pode usar o intellisense para obter o espaço para nome System.Configuration, mas ele não tem a classe ConfigurationManager. Basta adicionar a referência e isso a corrige.
Francine DeGrood Taylor
3
@Cricketheads System.Configuration contém o ConfigurationManager, é provável que você não tenha uma referência a System.Configuration no seu projeto.
Trek
2
Alguém pode me dizer por que eles acham que System.Configuration não é adicionado por padrão ... isso parece uma necessidade bastante básica na maioria dos aplicativos.
Todd Vance
89

Atualização para o .NET Framework 4.5 e 4.6; o seguinte não funcionará mais:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Agora acesse a classe Setting via Properties:

string keyvalue = Properties.Settings.Default.keyname;

Consulte Gerenciando configurações do aplicativo para obter mais informações.

bsivel
fonte
1
Propriedades desde 2010 .
21416 Nick Westgate
1
Muito obrigado por postar isto. Eu determinei que Properties.Settings.Default.MachName funcionou, mas não consegui descobrir por que o ConfigurationManager.AppSettings ["MachName"] retornou nulo.
1911 Chris J. Compton
1
Isso acabou com minha agonia prolongada. Obrigado. A estrutura deve avisá-lo de que a maneira antiga é obsoleta.
28517 Neil B
7
Não foi possível confirmar. O ConfigurationManager.AppSettings ["someKey"] funciona no .NET 4.5, 4.6, 4.7.1
Ivanhoe
1
@Ivanhoe Qual versão do VisualStudio você usou? O ConfigurationManager.AppSettings ["someKey"] funcionou com 4.6.1 e VS 15.8.2, mas falhou com 4.6.1 e VS 15.9.2 para mim.
Kkkilla
37

Clique com o botão direito na sua biblioteca de classes e escolha a opção "Adicionar referências" no menu.

E na guia .NET, selecione System.Configuration. Isso incluiria o arquivo DLL System.Configuration em seu projeto.

Shiva
fonte
Depois de adicionar referência, era capaz de fazerConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy
29

Estou usando isso e funciona bem para mim:

textBox1.Text = ConfigurationManager.AppSettings["Name"];
Pagey
fonte
48
O TS declara explicitamente que ele usa o mesmo código, mas seu projeto falha na compilação (devido à falta de referências, como se viu). -1 por não ler a pergunta.
Isantipov 12/03/2013
23

Read From Config:

Você precisará adicionar uma referência à configuração:

  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;

Salve na configuração:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
Masoud Siahkali
fonte
1
FYI: O Google gosta mais da sua resposta. Aparece literalmente quando você procura por "obter configurações de configuração de aplicativo c #" #
Steve Gomez
21

Você deve adicionar uma referência ao assembly System.Configuration ao projeto.

Otávio Décio
fonte
18

Você pode estar adicionando o arquivo App.config a um arquivo DLL. App.Config funciona apenas para projetos executáveis, pois todos os arquivos DLL retiram a configuração do arquivo de configuração para o arquivo EXE que está sendo executado.

Digamos que você tenha dois projetos em sua solução:

  • SomeDll
  • SomeExe

Seu problema pode estar relacionado ao fato de você estar incluindo o arquivo app.config no SomeDLL e não no SomeExe. SomeDll é capaz de ler a configuração do projeto SomeExe.

Victor Naranjo
fonte
Uau, isso não é óbvio. Se alguém pudesse vincular um documento falando sobre isso, seria fantástico. Este é um tópico difícil de pesquisar.
David Krider
Obrigado por isso. Não vi isso declarado em lugar algum.
parâmetro
10

Tente o seguinte:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

No arquivo web.config, essa deve ser a próxima estrutura:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
Ruslan
fonte
8

Eu tive o mesmo problema. Apenas leia-os desta maneira: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]

Tom
fonte
4
De acordo com a Microsoft sobre o ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M
2
este método é obsoleto
GabrielBB
7

web.configé usado com aplicativos da web. web.configpor padrão, possui várias configurações necessárias para o aplicativo da web. Você pode ter um web.configpara cada pasta em seu aplicativo da web.

app.configé usado para aplicativos do Windows. Quando você cria o aplicativo no Visual Studio, ele é automaticamente renomeado <appname>.exe.confige esse arquivo deve ser entregue junto com o aplicativo.

Você pode usar o mesmo método para chamar os app settingsvalores dos dois arquivos de configuração: System.Configuration.ConfigurationSettings.AppSettings ["Key"]

Wavare Santosh
fonte
Também é possível usar em System.Configuration.COnfigurationSettings.AppSettings.Get("Key")vez de usar colchetes.
Mason
7

Como eu encontrei a melhor abordagem para acessar variáveis ​​de configurações de aplicativos de maneira sistemática, criando uma classe de wrapper sobre System.Configuration como abaixo

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;

            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

Agora podemos acessar as variáveis ​​de configuração necessárias por nomes codificados usando outra classe, como abaixo:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting

    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }

    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }

    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }

    #endregion App setting

    #region global setting


    #endregion global setting
}
Ashwini Jindal
fonte
Isso usa o método indicado pelo OP é marcado como obsoleto.
precisa saber é o seguinte
4

Eu recomendo fortemente que você crie um wrapper para esta chamada. Algo como ae ConfigurationReaderServiceuse injeção de dependência para obter essa classe. Dessa forma, você poderá isolar esses arquivos de configuração para fins de teste.

Portanto, use o ConfigurationManager.AppSettings["something"];sugerido e retorne esse valor. Com esse método, você pode criar algum tipo de retorno padrão se não houver nenhuma chave disponível no arquivo .config.

Custodio
fonte
3
Microsoft já tem um bulit-in maneira de gerenciar múltiplas versões do mesmo arquivo de configuração: configurações de compilação , que permitem ter arquivos de configuração separados para cada configuração de compilação: app.DEBUG.config, app.RELEASE.confige app.TEST.config, etc.
jpaugh
4

Além disso, você pode usar o Formo :

Configuração:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Código:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();
pomber
fonte
5
Por que diabos você gostaria de fazer isso?
lukejkw
3

Apenas para completar, existe outra opção disponível apenas para projetos da web: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

O benefício disso é que ele não requer que uma referência extra seja adicionada, portanto pode ser preferível para algumas pessoas.

rdans
fonte
3

Etapa 1: Clique com o botão direito do mouse na guia referências para adicionar referência.

Etapa 2: clique na guia Assemblies

Etapa 3: procure por 'System.Configuration'

Etapa 4: Clique em OK.

Então vai funcionar.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
Jitendra Suthar
fonte
2

Eu sempre crio uma interface IConfig com propriedades typesafe declaradas para todos os valores de configuração. Uma classe de implementação Config agrupa as chamadas para System.Configuration. Todas as suas chamadas System.Configuration agora estão em um só lugar, e é muito mais fácil e limpo manter e rastrear quais campos estão sendo usados ​​e declarar seus valores padrão. Escrevo um conjunto de métodos auxiliares particulares para ler e analisar tipos de dados comuns.

Usando uma estrutura de IoC , você pode acessar os campos IConfig em qualquer lugar do seu aplicativo simplesmente passando a interface para um construtor de classe. Você também poderá criar implementações simuladas da interface IConfig em seus testes de unidade, para que agora possa testar vários valores de configuração e combinações de valores sem precisar tocar no arquivo App.config ou Web.config.

Tony O'Hagan
fonte
1

Outra solução possível:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
sherite
fonte
1

Estou tentando encontrar uma correção para esse mesmo problema há alguns dias. Consegui resolver isso adicionando uma chave na tag appsettings no arquivo web.config . Isso deve substituir o arquivo .dll ao usar o auxiliar.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>
Jason
fonte
1

Você pode usar a linha abaixo. No meu caso, estava funcionando: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Você deve ter cuidado para que a linha de código acima também seja a versão antiga e seja preterida em novas bibliotecas.

Mohammad D
fonte
1

O ConfigurationManager não é o que você precisa para acessar suas próprias configurações.

Para fazer isso, você deve usar

{YourAppName}.Properties.Settings.{settingName}

martin c
fonte
1

Consegui obter a abordagem abaixo trabalhando para projetos do .NET Core:

Passos:

  1. Crie um appsettings.json (formato fornecido abaixo) em seu projeto.
  2. Em seguida, crie uma classe de configuração. O formato é fornecido abaixo.
  3. Eu criei um método Login () para mostrar o uso da Classe de Configuração.

    Crie appsettings.json no seu projeto com o conteúdo:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }
user3534040
fonte
1

Se você precisa / deseja usar a ConfigurationManagerclasse ...

Pode ser necessário carregar System.Configuration.ConfigurationManagerpela Microsoft via NuGet Package Manager

Ferramentas-> Gerenciador de Pacotes NuGet-> Gerenciar Pacotes NuGet para Solução ...

Docs da Microsoft

Uma coisa que vale a pena notar nos documentos ...

Se seu aplicativo precisar de acesso somente leitura à sua própria configuração, recomendamos que você use o método GetSection (String). Este método fornece acesso aos valores de configuração em cache para o aplicativo atual, que possui melhor desempenho que a classe Configuration.

Chris Catignani
fonte
0

Verifique a versão do .NET em que você está trabalhando. Deve ser maior que 4. E você precisa adicionar a biblioteca do sistema System.Configuration ao seu aplicativo.

nayanajith
fonte
3
Esta pergunta foi feita há mais de 9 anos e já possui mais de 20 respostas, incluindo 2, cada uma com mais de 600 votos positivos, a resposta aceita é adicionar uma referência ao System.Configuration. Esta resposta adicional não agrega valor. Na melhor das hipóteses, este deve ser um comentário sobre a resposta aceita.
Richardissimo 23/09
Re "maior que 4" : no número da versão principal? Ou você quer dizer "superior a 4,0" ? Ou, em outras palavras, de que lado o .NET Framework 4.5 estaria?
Peter Mortensen
-8

Aqui está um exemplo: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
JMat
fonte