ConfigurationSettings.AppSettings пуст, выдает нулевое исключение
-
05-07-2019 - |
Вопрос
У меня есть такой класс, как этот:
public class RxNormFolderMgr
{
// properties
public string RxNormFolder { get { return ConfigurationSettings.AppSettings["rootFolder"].ToString(); } }
}
Когда я пытаюсь использовать это вот так:
public class TestRxNormFolderManager : ColumnFixture
{
public string RxNormFolder()
{
RxNormFolderMgr folderMgr = new RxNormFolderMgr();
return folderMgr.RxNormFolder;
}
}
Я получаю сообщение об ошибке:"Система.Отражение.Исключение TargetInvocationException:Исключение было сгенерировано целью вызова.---> Исключение System.NullReferenceException:Ссылка на объект не установлена на экземпляр объекта ". Свойство AllKeys для AppSettings представляет собой массив нулевой длины, где я ожидаю длину 1.
Мой файл app.config в проекте выглядит следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="rootFolder" value ="C:\RxNorm" />
<!-- Root folder must not end with slash. -->
</appSettings>
</configuration>
Я знаю ConfigurationSettings.AppSettings должен быть устаревшим, и я должен использовать ConfigurationManager.AppSettings, но я даже не могу заставить это скомпилировать.У меня есть ссылка в проекте на систему.конфигурация (c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.DLL на моей машине) и using в верхней части моего кода.
Я использую Fitnesse для тестирования кода, и именно тогда я получаю сообщение об ошибке.Насколько я понимаю, я также должен поместить копию файла app.config в папку Bin> Debug проекта test fixtures, который я уже сделал.Итак, я не знаю, почему я до сих пор получаю эту ошибку.
Пожалуйста, помогите.
Решение
Когда вы тестируете с помощью FitNesse, фактический исполняемый файл выполняется "FitServer.exe", поэтому AppSettings ищет "FitServer.exe.config" в каталоге с FitServer.exe lives.Итак, быстрое и грязное решение - скопировать туда файл app.config и переименовать его.
Лучшим решением является указание конфигурации приложения, как описано здесь: http://www.syterra.com/FitnesseDotNet/ApplicationConfigurationFile.html
или, если вы используете fitSharp (что является улучшением FitNesse.NET): http://www.syterra.com/Fit/AppConfigFiles.html
Другие советы
Также: попробуйте использовать ConfigurationManager
класс вместо "ConfigurationSettings":
Сначала используйте проверку на наличие NOT NULL:
public class RxNormFolderMgr
{
// properties
public string RxNormFolder
{
get
{
if(ConfigurationManager.AppSettings["rootFolder"] != null)
{
return ConfigurationManager.AppSettings["rootFolder"].ToString();
}
return string.Empty;
}
}
}
Это внутри сборки библиотеки классов?Они никогда не используют свой собственный app.config, а вместо этого используют app.config хост-приложения (приложение, которое использует библиотеку классов).
Марк
Не помещайте это в appsettings.Использование <connectionStrings>
пример:
<appSettings />
<connectionStrings> <add name="NORTHWNDConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory| ORTHWND.MDF;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" />
</connectionStrings>
строка cnstr = ConfigurationManager.Строки подключения["NORTHWNDConnectionString"].toString();