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

#asp.net #.net-core

#c# #.net-core

Вопрос:

У меня проблема. Мне нужно написать программу на .Net Core (C #), которая использует 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=localhostSQLExpress;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.Система.Конфигурация -версия 4.2.3-r4 -Pre и все еще не работает. Может быть, кто-нибудь может мне помочь?

Комментарии:

1. Я думаю, что для .net core вы будете использовать файлы json для настройки. Посмотрите на это.

2. В .NET Core вы используете appsettings.json, а не app.config.

3. но я сказал о. Сетевое ядро и не ASP.Net ядро

4. «Это пример из Интернета, поэтому я подумал, что это сработает» — самое большое заблуждение за всю историю.

5. Microsoft также выпустила пакет NuGet, который позволяет использовать классические конфигурационные файлы с .NET Core nuget.org/packages/System . Конфигурация. ConfigurationManager

Ответ №1:

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

  1. Создал библиотеку .NET Standard 2.0 (скажем MyLib.dll )
  2. Добавлен пакет NuGet System.Configuration.ConfigurationManager версии 4.4.0. Это необходимо, поскольку на этот пакет не распространяется мета-пакет NetStandard.Library версии 0.0 (я надеюсь, что это изменится)
  3. Все ваши классы C # являются производными от 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 (test).

Кроме того, расположение app.config во время выполнения отличается от того, что было в .net framework, вместо «ProjectName.exe.config». Теперь это «ProjectName.dll.config» в .net core.

Дополнительный обходной путь для тестовых проектов

Если вы обнаружите, что ваш App.config не работает в ваших тестовых проектах, вам может понадобиться этот фрагмент в вашем тестовом проекте .csproj (например, непосредственно перед окончанием </Project> ). Он в основном копирует App.config в вашу выходную папку, так как testhost.dll.config so dotnet test его подбирает.

   <!-- START: This is a buildtime work around for https://github.com/dotnet/corefx/issues/22101 -->
  <Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)testhost.dll.config" />
  </Target>
  <!-- END: This is a buildtime work around for https://github.com/dotnet/corefx/issues/22101 -->
  

Комментарии:

1. Это должен быть правильный ответ, переход с .NET Framework на . NET core будет быстрее и проще, если эту тривиальную вещь можно обойти

Ответ №2:

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

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

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

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

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

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

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

Ответ №3:

У меня есть проект .Net Core 3.1 MSTest с аналогичной проблемой. Этот пост предоставил подсказки, чтобы исправить это.

Разбив это на простой ответ для .Net core 3.1:

  • добавьте / убедитесь, что пакет nuget: System.Конфигурация.ConfigurationManager для проекта
  • добавьте свой app.config (xml) в проект.

Если это проект MSTest:

  • переименуйте файл в проекте в testhost.dll.config

    или

  • Используйте команду после сборки, предоставленную DeepSpace101

Комментарии:

1. Это сработало для меня, но мне пришлось вручную скопировать файл testhost.dll.config в папку bin

Ответ №4:

Я не хотел импортировать дополнительные зависимости, поэтому остановился на следующем:

 class Main
{
    private static readonly NameValueCollection AppSettings = ConfigurationManager.AppSettings;

    public static void Main(string[] args)
    {
        var appSettings = new MemoryConfigurationSource
        {
            InitialData = AppSettings.AllKeys.ToDictionary(key => key, key => AppSettings[key]),
        };
        var config = new ConfigurationBuilder()
            .AddCommandLine(args)
            .Add(appSettings)
            .Build();
    }
}
  

Просто сопоставление ConfigurationManager.AppSettings в MemoryConfigurationSource.