ConfigurationSettings.AppSettings est vide, lève une exception null
-
05-07-2019 - |
Question
J'ai une classe comme celle-ci:
public class RxNormFolderMgr
{
// properties
public string RxNormFolder { get { return ConfigurationSettings.AppSettings["rootFolder"].ToString(); } }
}
Quand j'essaie de l'utiliser comme ceci:
public class TestRxNormFolderManager : ColumnFixture
{
public string RxNormFolder()
{
RxNormFolderMgr folderMgr = new RxNormFolderMgr();
return folderMgr.RxNormFolder;
}
}
Je reçois une erreur: & "System.Reflection.TargetInvocationException: une exception a été levée par la cible d'un appel. --- > System.NullReferenceException: la référence d'objet n'est pas définie sur une instance d'objet. & Quot; La propriété AllKeys pour AppSettings est un tableau de longueur nulle où je m'attends à une longueur de 1.
Mon fichier app.config dans le projet se présente comme suit:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="rootFolder" value ="C:\RxNorm" />
<!-- Root folder must not end with slash. -->
</appSettings>
</configuration>
Je sais que ConfigurationSettings.AppSettings est censé être obsolète et que je devrais utiliser ConfigurationManager.AppSettings, mais je ne parviens même pas à le compiler. J'ai dans le projet une référence à System.configuration (c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ System.configuration.dll sur ma machine) et à l'utilisation de l'instruction en haut de mon code.
J'utilise Fitnesse pour tester le code, et c'est à ce moment-là que j'obtiens l'erreur. Si j'ai bien compris, je devrais également placer une copie du fichier app.config dans le dossier Bin & Gt; Debug du projet de fixtures de test que j'ai déjà créé. Donc, je ne sais pas pourquoi je reçois encore cette erreur.
S'il vous plaît, aidez-nous.
La solution
Lorsque vous testez avec FitNesse, l'exécutable en cours d'exécution est " FitServer.exe " donc AppSettings recherche un " FitServer.exe.config " dans le répertoire avec FitServer.exe vit. Une solution simple et rapide consiste donc à copier votre application.config et à la renommer.
Une meilleure solution consiste à spécifier la configuration de l'application comme décrit ici: http://www.syterra.com/FitnesseDotNet/ApplicationConfigurationFile.html
ou si vous utilisez fitSharp (qui est une amélioration de FitNesse.NET): http://www.syterra.com/Fit/AppConfigFiles.html
Autres conseils
En outre: , essayez d'utiliser la classe ConfigurationManager
au lieu de & "ConfigurationSettings &":
Commencez par utiliser une vérification pour NOT NULL:
public class RxNormFolderMgr
{
// properties
public string RxNormFolder
{
get
{
if(ConfigurationManager.AppSettings["rootFolder"] != null)
{
return ConfigurationManager.AppSettings["rootFolder"].ToString();
}
return string.Empty;
}
}
}
Est-ce à l'intérieur d'un assemblage de bibliothèque de classes? Ceux-ci n'utilisent jamais leur propre app.config - mais utilisent l'app.config de l'application hôte (l'application qui utilise la bibliothèque de classes).
Marc
Ne le mettez pas dans les appsettings. Utilisez & Lt; connectionStrings & Gt;
exemple:
< appSettings / >
< connectionStrings > < add name = & "NORTHWNDConnectionString &"; connectionString = " Source de données =. \ SQLEXPRESS; AttachDbFilename = | Répertoire de données | \ NORTHWND.MDF; Sécurité intégrée = True; Instance utilisateur = True " providerName = & "System.Data.SqlClient &" / >
< / connectionStrings >
string cnstr = ConfigurationManager.ConnectionStrings [& "NORTHWNDConnectionString &";]. ToString ();