Avatar ·

Чтение настроек из app.config или web.config в .NET: пошаговое руководство для новичков

Всем привет! Я новичок в C# и .NET, и у меня возникла проблема с чтением настроек из конфигурационных файлов. У меня есть консольное приложение, в котором я хочу хранить строку подключения к базе данных и несколько пользовательских параметров (например, таймаут и путь к логам) в файле app.config. Я добавил этот файл в проект, но не могу понять, как правильно прочитать оттуда значения. Вот мой app.config: ```xml ``` Я пробовал писать код так: ```csharp string connStr = ConfigurationManager.AppSettings["ConnectionString"]; int timeout = int.Parse(ConfigurationManager.AppSettings["TimeoutSeconds"]); ``` Но Visual Studio ругается, что не может найти `ConfigurationManager`. Я добавил в using `System.Configuration`, но это не помогло. Что я делаю не так? Может быть, нужно что-то дополнительно установить или подключить? И как правильно работать с разными типами данных (int, bool)? Буду благодарен за подробное объяснение с примерами кода! <<>>

Основная причина ошибки и её решение

Ошибка возникает из-за того, что класс ConfigurationManager находится в сборке System.Configuration.dll, которая не подключена по умолчанию в новых проектах .NET (особенно .NET Core / .NET 5+). Вам нужно явно добавить ссылку на эту сборку.

Шаг 1: Установка пакета (для .NET Core / .NET 5+)

Откройте консоль диспетчера пакетов (Tools → NuGet Package Manager → Package Manager Console) и выполните команду:

Install-Package System.Configuration.ConfigurationManager

Или через UI: ПКМ на проекте → Manage NuGet Packages → найдите и установите System.Configuration.ConfigurationManager.

Шаг 2: Подключение пространства имён

Добавьте в начало вашего файла:

using System.Configuration;

Шаг 3: Чтение настроек

Теперь код будет работать. Вот полный пример с обработкой ошибок и приведением типов:

using System;
using System.Configuration;

class Program
{
    static void Main()
    {
        // Чтение строки
        string connectionString = ConfigurationManager.AppSettings["ConnectionString"];
        if (string.IsNullOrEmpty(connectionString))
        {
            Console.WriteLine("Ошибка: строка подключения не найдена.");
            return;
        }

        // Чтение числа с проверкой
        string timeoutStr = ConfigurationManager.AppSettings["TimeoutSeconds"];
        int timeout;
        if (!int.TryParse(timeoutStr, out timeout))
        {
            Console.WriteLine("Ошибка: неверный формат таймаута.");
            timeout = 30; // значение по умолчанию
        }

        // Чтение булевого значения
        string logEnabledStr = ConfigurationManager.AppSettings["LogEnabled"];
        bool logEnabled;
        if (!bool.TryParse(logEnabledStr, out logEnabled))
        {
            logEnabled = true; // по умолчанию
        }

        Console.WriteLine($"Строка подключения: {connectionString}");
        Console.WriteLine($"Таймаут: {timeout} секунд");
        Console.WriteLine($"Логирование включено: {logEnabled}");
    }
}

Работа с разными типами данных

  • string — всегда читается как строка. Используйте ConfigurationManager.AppSettings["key"]
  • int — используйте int.TryParse() для безопасного преобразования
  • bool — используйте bool.TryParse() (принимает "true"/"false" без учёта регистра)
  • double — аналогично через double.TryParse()

Строки подключения (ConnectionStrings)

Для строк подключения лучше использовать специальную секцию <connectionStrings>:

<connectionStrings>
    <add name="MyDB" connectionString="Server=...;Database=...;" providerName="System.Data.SqlClient"/>
</connectionStrings>

Чтение:

string connStr = ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString;

Важные замечания

  • Файл конфигурации должен называться app.config для консольных/десктопных приложений и web.config для веб-приложений
  • После сборки файл автоматически копируется как ИмяПроекта.exe.config (или web.config)
  • Изменения в файле конфигурации применяются только после перезапуска приложения
  • Для .NET Core/.NET 5+ рекомендуется использовать более современный подход с IConfiguration и файлами appsettings.json, но ConfigurationManager всё ещё работает для обратной совместимости

Теперь ваше приложение будет корректно читать настройки из конфигурационного файла!

<<>>

Альтернативный подход: использование пользовательских настроек (Settings)

Если вам нужно не только читать, но и сохранять настройки во время работы приложения, рекомендую использовать встроенный механизм Settings (Settings.settings).

Как это работает

  1. В Visual Studio: ПКМ на проекте → Properties → вкладка Settings
  2. Добавьте настройки с указанием имени, типа и значения по умолчанию
  3. Visual Studio автоматически создаст класс Properties.Settings

Пример кода

using Properties;

// Чтение
string connStr = Settings.Default.ConnectionString;
int timeout = Settings.Default.TimeoutSeconds;

// Запись (сохраняется при следующем запуске)
Settings.Default.TimeoutSeconds = 60;
Settings.Default.Save();

Преимущества

  • Поддержка типов (int, bool, string, Color, Font и др.)
  • Автоматическая генерация кода
  • Возможность сохранять изменения
  • Типобезопасность (не нужно парсить строки)

Недостатки

  • Сложнее с миграцией между средами (Dev/Test/Prod)
  • Настройки хранятся в user.config в папке пользователя

Выбирайте подход в зависимости от задачи: для простого чтения — ConfigurationManager, для динамических настроек — Settings.