ConfigurationSettings.AppSettings è vuoto, genera un'eccezione nulla
-
05-07-2019 - |
Domanda
Ho una classe come questa:
public class RxNormFolderMgr
{
// properties
public string RxNormFolder { get { return ConfigurationSettings.AppSettings["rootFolder"].ToString(); } }
}
Quando provo ad usarlo in questo modo:
public class TestRxNormFolderManager : ColumnFixture
{
public string RxNormFolder()
{
RxNormFolderMgr folderMgr = new RxNormFolderMgr();
return folderMgr.RxNormFolder;
}
}
Ricevo un errore: " System.Reflection.TargetInvocationException: l'eccezione è stata generata dalla destinazione di una chiamata. --- gt &; System.NullReferenceException: riferimento all'oggetto non impostato su un'istanza di un oggetto. & Quot; La proprietà AllKeys per AppSettings è un array di lunghezza zero in cui mi aspetto una lunghezza di 1.
Il mio file app.config nel progetto è simile al seguente:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="rootFolder" value ="C:\RxNorm" />
<!-- Root folder must not end with slash. -->
</appSettings>
</configuration>
So che ConfigurationSettings.AppSettings dovrebbe essere obsoleto e dovrei usare ConfigurationManager.AppSettings, ma non riesco nemmeno a farlo compilare. Ho un riferimento nel progetto a System.configuration (c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ System.configuration.dll sulla mia macchina) e usando l'istruzione nella parte superiore del mio codice.
Sto usando Fitnesse per testare il codice, ed è allora che ottengo l'errore. Comprendo che dovrei anche inserire una copia del file app.config nella cartella Bin & Gt; Debug del progetto di dispositivi di test che ho eseguito. Quindi, non so perché visualizzo ancora questo errore.
Per favore, aiuto.
Soluzione
Quando si esegue il test con FitNesse, l'eseguibile effettivo in esecuzione è " FitServer.exe " quindi AppSettings sta cercando un " FitServer.exe.config " nella directory con vite FitServer.exe. Quindi una soluzione rapida e sporca è copiare lì la tua app.config e rinominarla.
Una soluzione migliore è specificare la configurazione dell'app come descritto qui: http://www.syterra.com/FitnesseDotNet/ApplicationConfigurationFile.html
o se stai usando fitSharp (che è un miglioramento di FitNesse.NET): http://www.syterra.com/Fit/AppConfigFiles.html
Altri suggerimenti
Inoltre: prova a utilizzare la classe ConfigurationManager
anziché " ConfigurationSettings " ;:
Utilizza prima un segno di spunta per NOT NULL:
public class RxNormFolderMgr
{
// properties
public string RxNormFolder
{
get
{
if(ConfigurationManager.AppSettings["rootFolder"] != null)
{
return ConfigurationManager.AppSettings["rootFolder"].ToString();
}
return string.Empty;
}
}
}
È all'interno di un assembly della libreria di classi? Quelli non usano mai la propria app.config, ma invece usano l'app.config dell'app host (l'app che usa la libreria di classi).
Marc
Non inserirlo nelle impostazioni delle app. Usa & Lt; connectionStrings & Gt;
Esempio:
lt &; AppSettings / gt &;
lt &; & ConnectionStrings gt; < aggiungi nome = " NORTHWNDConnectionString " connectionString = " Origine dati =. \ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ NORTHWND.MDF; Sicurezza integrata = True; Istanza utente = True " providerName = quot &; System.Data.SqlClient quot &; / gt &;
lt &; / ConnectionStrings gt &;
string cnstr = ConfigurationManager.ConnectionStrings [" NORTHWNDConnectionString "]. ToString ();