"Ссылка на объект не указывает на экземпляр объекта" при чтении конфигурационного файла. c#
Я пытаюсь открыть свой config файл и прочитать от туда значение (ключа или значения не важно) и получаю ошибку "Ссылка на объект не указывает на экземпляр объекта". Что я делаю не так? Код с формы:
private void Form1_Load(object sender, EventArgs e)
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"C:\MyApp.config";
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
string c = configuration.AppSettings.Settings["Login"].Key;
textBox1.Text = c;
}
Код config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Login" value="" />
</appSettings>
</configuration>
Пожалуйста подскажите.
Ответы (2 шт):
Если тебе без разницы где будет лежать твой конфиг файл. То лучше использовать встроенный конфиг, который находится в твоем проекте. Тогда можно будет вместо всего кода в Form1_Load написать просто
textBox1.Text = ConfigurationManager.AppSettings["Login"];
Если же тебе надо именно использовать сторонний конфиг, то тебе надо будет прописать в конфиге, который находится у тебя в проекте, следующее
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<appSettings file="C:\Users\MyApp.config">
<add key="SomeValue" value="value" />
</appSettings>
</configuration>
Основной трюк здесь в строчке file="C:\Users\MyApp.config" здесь ты указываешь путь к дополнительному конфигу из которого будут вычитываться данные. Так же тебе будут доступны данные из стандартного конфига приложения. Произойдет мерж двух конфигов.
Второй конфиг должен будет иметь следующую структуру
<appSettings>
<add key="Login" value="aaaaaaa" />
</appSettings>
И тогда ты можешь использовать внешний конфиг к доплнению к стандартному и так же просто написать:
textBox1.Text = ConfigurationManager.AppSettings["Login"];
Если есть какие-то вопросы, то могу пояснить
Спасибо большое всем за ответы! Но я смогла найти сама ответ на свой вопрос. Данный выше код работает прекрасно если создавать не config файл, а xml и тогда все прекрасно редактируется и изменяется. Еще один не мало важный факт.. не знаю почему, но программно нельзя сохранить пустую строку! Что меня удивило, ведь и в config и в xml можно прописать пустое значение и все будет работать... (PS: Данный код xml можно прописать и в конфиг) Так же обращение к Xml файлу исправило ошибку заданную мной в вопросе.
Прикладываю свой код решения. Вдруг кому-нибудь пригодится...
Код в Form1:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (textBox2.Text.Length > 0 && textBox3.Text.Length > 0 && st == true && checkBox1.Checked == true)
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"C:\Project\Visual Studio\Agenstvo\XMLFile1.xml";
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
configuration.AppSettings.Settings["Login"].Value = " ";
configuration.AppSettings.Settings["Password"].Value = " ";
configuration.AppSettings.Settings["check"].Value = Convert.ToString(checkBox1.Checked);
configuration.Save();
}
Код в Form2:
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if (avt != true)
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"C:\Project\Visual Studio\Agenstvo\XMLFile1.xml";
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
configuration.AppSettings.Settings["Login"].Value = " ";
configuration.AppSettings.Settings["Password"].Value = " ";
configuration.AppSettings.Settings["check"].Value = Convert.ToString(false);
configuration.Save();
}
}
Xml файл код:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Login" value="" />
<add key="Password" value="" />
<add key="check" value="False" />
</appSettings>
</configuration>