Использование app.config в .Net Core

У меня проблема. Мне нужно написать программу в .Net Core (С#), которая использует app.config следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="custom" type="ConfigurationSample.CustomConfigurationSection, ConfigurationSample"/>
  </configSections>
  <connectionStrings>
    <add name="sampleDatabase" connectionString="Data Source=localhost\SQLExpress;Initial Catalog=SampleDatabase;Integrated Security=True"/>
  </connectionStrings>
  <appSettings>
    <add key="sampleApplication" value="Configuration Sample"/>
  </appSettings>
  <custom>
    <customConfigurations>
      <add key="customSample" name="Mickey Mouse" age="83"/>
    </customConfigurations>
  </custom>
</configuration>

и я пишу:

string connectionString = ConfigurationManager.ConnectionStrings["sampleDatabase"].ConnectionString;
Console.WriteLine(connectionString);

// read appSettings configuration
string appSettingValue = ConfigurationManager.AppSettings["sampleApplication"];
Console.WriteLine(appSettingValue);

и это пример из Интернета, поэтому я думал, что это сработает, но я получаю исключения:

System.Configuration.ConfigurationErrorsException: 'Error Initializing the configuration system.'
Inner Exception
TypeLoadException: Could not load type 'System.Configuration.InternalConfigurationHost' from assembly 'CoreCompat.System.Configuration, Version=4.2.3.0, Culture=neutral, PublicKeyToken=null' because the method 'get_bundled_machine_config' has no implementation (no RVA).

Я загрузил через NuGet - Install-Package CoreCompat.System.Configuration -Version 4.2.3-r4 -Перед и все еще не работает. Может быть, кто-то может мне помочь?

Ответ 1

  1. API конфигурации можно использовать с любым приложением .NET Core, а не только с приложением ASP.NET Core. Посмотрите пример, приведенный в ссылке, которая показывает, как читать конфиги в консольном приложении.

  2. В большинстве случаев источник JSON (читается как файл .json) является наиболее подходящим источником конфигурации.

    Примечание: не смущайтесь, когда кто-то говорит, что файл конфигурации должен быть appsettings.json. Вы можете использовать любое имя файла, которое подходит вам, и местоположение файла может быть другим - никаких особых правил нет.

    Но, поскольку реальный мир сложен, существует множество различных провайдеров конфигурации:

    • Форматы файлов (INI, JSON и XML)
    • Аргументы командной строки
    • Переменные среды

    и так далее. Вы даже можете использовать/написать собственный провайдер.

  3. На самом деле app.config конфигурации app.config был файлом XML. Таким образом, вы можете прочитать настройки из него с помощью провайдера конфигурации XML (источник на github, ссылка nuget). Но имейте в виду, что он будет использоваться только как источник конфигурации - любая логика поведения вашего приложения должна быть реализована вами. Поставщик конфигурации не будет изменять "настройки" и устанавливать политики для ваших приложений, а только будет читать данные из файла.

Ответ 2

Можно использовать свой обычный System.Configuration даже в .NET Core 2.0 в Linux. Попробуйте этот тестовый пример:

  1. Создана библиотека .NET Standard 2.0 (скажем, MyLib.dll)
  2. Добавлен пакет NuGet System.Configuration.ConfigurationManager v4.4.0. Это необходимо, поскольку этот пакет не включен в метапакет NetStandard.Library v2.0.0 (надеюсь, что он изменится)
  3. Все ваши классы С#, полученные из ConfigurationSection или ConfigurationElement, попадают в MyLib.dll. Например, MyClass.cs происходит от ConfigurationSection, а MyAccount.cs происходит от ConfigurationElement. Детали реализации здесь выходят за рамки, но Google - ваш друг
  4. Создайте приложение .NET Core 2.0 (например, консольное приложение, MyApp.dll). Приложения .NET Core заканчиваются на .dll, а не на .exe в Framework.
  5. Создайте app.config в MyApp с вашими пользовательскими разделами конфигурации. Очевидно, это должно соответствовать дизайну вашего класса в # 3 выше. Например:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="myCustomConfig" type="MyNamespace.MyClass, MyLib" />
  </configSections>
  <myCustomConfig>
    <myAccount id="007" />
  </myCustomConfig>
</configuration>

Что это - вы обнаружите, что app.config правильно проанализирован в MyApp, а ваш существующий код в MyLib работает просто отлично. Не забудьте запустить dotnet restore, если вы переключаете платформы с Windows (dev) на Linux (тестирование).