AppSettings obtient la valeur du fichier .config

172

Je ne parviens pas à accéder aux valeurs du fichier de configuration.

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

Fichier .config :

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

Avez-vous des suggestions que dois-je faire?

Mat
la source

Réponses:

345

Cela fonctionne pour moi:

string value = System.Configuration.ConfigurationManager.AppSettings[key];
Adam
la source
6
Le code que j'ai fourni nécessite que le fichier YourProgram.exe.config existe dans le même dossier que YourProgram.exe. Assurez-vous simplement que c'est là. Une erreur courante consiste à copier le fichier app.config dans le répertoire de destination, ce qui ne fonctionnera pas.
Adam
40
Nécessite une référence supplémentaire System.Configuration.
somme de contrôle du
13
Mon .NET 4.5 System.Configuration n'a pasConfigurationManager
qwert_ukg
3
J'obtiens également un null dans un projet 4.5 - j'ai passé deux heures là-dessus .. Doit être un bogue.
IrishChieftain
1
Je vois aussi cela dans une application multi-cible, ma configuration de base .net fonctionne mais la configuration du framework .net ne le fait pas (en utilisant ConfigurationManager)
Michael Brown
61

La réponse que dtsg a donné fonctionne:

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

MAIS, vous devez ajouter une référence d'assemblage à

Configuration du système

Accédez à votre Explorateur de solutions et cliquez avec le bouton droit sur Références et sélectionnez Ajouter une référence . Sélectionnez l' onglet Assemblies et recherchez Configuration .

Gestionnaire de références

Voici un exemple de mon 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>

Ce que vous pouvez obtenir de la manière suivante:

string adminName = ConfigurationManager.AppSettings["AdminName"];
rotgers
la source
2
Je semble avoir le même problème que OP. Utilisation de VS2015. Je ne sais pas comment ni pourquoi, mais ma référence à System.Configuration dit System.configuration (en minuscules).
Tim
Cela pourrait faire avec une explication pour couvrir les endroits où il n'y a pas d'onglet «assemblages» (au moins VS2019)
SomeoneElse
21

Essayez ceci:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
dtsg
la source
4
Votre implémentation doit être incorrecte. Cela fonctionne certainement pour récupérer les valeurs de clé d'un fichier de configuration.
dtsg
Assurez-vous d'ajouter une référence à System.Configuration dans les références de votre projet!
GrahamJ
19

Lire à partir de la configuration:

Vous devrez ajouter une référence à Config

  1. Ouvrez "Propriétés" sur votre projet
  2. Allez dans l'onglet "Paramètres"
  3. Ajouter "Nom" et "Valeur"
  4. Obtenez de la valeur en utilisant le code suivant:
string value = Properties.Settings.Default.keyname;

Enregistrer dans la configuration:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Masoud Siahkali
la source
4
Vraiment utile car toutes les autres réponses utilisant ConfigurationManager ne fonctionnent pas si vous ajoutez vos valeurs dans les onglets Paramètres des propriétés du projet comme vous l'avez décrit. Merci.
The Dumb Radish
2
Cela a fonctionné pour moi aussi. J'obtenais une nullchaîne avec les recommandations ci-dessus, mais j'ai Properties.Settings.Default.<keyName>travaillé comme un charme!
dub stylee
1
Parfait! Je cherchais ceci :) Merci!
HSQL
@Masoud Siahkali, La semaine dernière, j'ai essayé à peu près ce que vous avez ici dans mon propre projet, mais les valeurs, lorsqu'elles sont modifiées par l'utilisateur au moment de l'exécution (il suffit de l'exécuter à partir de l'interface graphique VS pour le moment) ne persistent pas entre les instances. Ma question: stackoverflow.com/questions/61018443/… . Je n'ai toujours pas compris pourquoi les paramètres modifiés par l'utilisateur de ces valeurs ne persistent pas ...
Marky
8

J'utilise:

    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"];

valeur1 = ... et valeur3 = ... donne null et valeur2 = ... fonctionne

Ensuite, j'ai décidé de remplacer l'app.config interne par:

// 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"];

Utilisation de VS2012 .net 4

Kkloé
la source
C'est exactement ce dont j'avais besoin. Vraiment utile, merci.
Umut OVECOGLU
5

Dans le app/web.configfichier, définissez la configuration suivante:

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

alors vous pouvez y accéder dans votre code en mettant cette ligne:

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

* Notez que cela fonctionne bien pour .net4.5.xet .net4.6.x; mais ne travaillez pas pour .net core. Meilleures salutations: Rafael

Rafael Andrs Cspedes Basterio
la source
3

Revenons à celui-ci après un long moment ...

Compte tenu de la disparition de ConfigurationManager, pour quiconque cherche toujours une réponse à cet essai (par exemple):

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

Nécessite bien sûr System.Configuration.

(Modification du code en quelque chose qui fonctionne réellement et qui est plus simple à lire)

Mike Dean
la source
Bonne réponse, mais s'il vous plaît nettoyer, pourquoi créer une nouvelle instance d'AppSettingsReader lorsque vous recréez AppSettingsReader à nouveau, et vous n'avez pas besoin de lancer une chaîne, vous pouvez simplement la terminer par un remplacement .ToString ().
maytham-ɯɐɥʇʎɐɯ
2

Voyez, j'ai fait ce que je pensais être la chose évidente était:

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

Pendant que cela compile, il renvoie toujours null.

Cela fonctionne cependant (d'en haut):

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

Certaines des réponses semblent un peu hors de l' OMI Voici ma prise vers 2016

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

Assurez-vous qu'il System.Configurationest référencé.

La question demande la valeur d'une clé appsettings

Ce qui devrait certainement être

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Voici une torsion dans laquelle vous pouvez regrouper des valeurs (pas pour cette question)

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

emails sera la valeur de la clé d'environnement + "_Emails"

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

Pour les applications Web, j'écrirai normalement cette méthode et je l'appellerai simplement avec la clé.

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

Vous pouvez simplement taper:

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

car keyest un objet et AppSettingsprend une chaîne

Soprano
la source
1
ConfigurationManager.RefreshSection("appSettings")
string value = System.Configuration.ConfigurationManager.AppSettings[key];
musicinmusique
la source
1

Ou vous pouvez utiliser

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

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

Mon test simple a également échoué, en suivant les conseils des autres réponses ici - jusqu'à ce que je réalise que le fichier de configuration que j'ai ajouté à mon application de bureau portait le nom "App1.config". Je l'ai renommé "App.config" et tout a immédiatement fonctionné comme il se doit.

BCA
la source
0
  1. Ouvrez "Propriétés" sur votre projet
  2. Allez dans l'onglet "Paramètres"
  3. Ajouter "Nom" et "Valeur"

LE CODE SERA GÉNÉRÉ AUTOMATIQUEMENT

    <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>

Pour obtenir une valeur

Propriétés.Settings.Default.Name

OU

Properties.Settings.Default ["nom"]

Hakan
la source