Использование 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
-
API конфигурации можно использовать с любым приложением .NET Core, а не только с приложением ASP.NET Core. Посмотрите пример, приведенный в ссылке, которая показывает, как читать конфиги в консольном приложении.
-
В большинстве случаев источник JSON (читается как файл .json
) является наиболее подходящим источником конфигурации.
Примечание: не смущайтесь, когда кто-то говорит, что файл конфигурации должен быть appsettings.json
. Вы можете использовать любое имя файла, которое подходит вам, и местоположение файла может быть другим - никаких особых правил нет.
Но, поскольку реальный мир сложен, существует множество различных провайдеров конфигурации:
- Форматы файлов (INI, JSON и XML)
- Аргументы командной строки
- Переменные среды
и так далее. Вы даже можете использовать/написать собственный провайдер.
-
На самом деле app.config
конфигурации app.config
был файлом XML. Таким образом, вы можете прочитать настройки из него с помощью провайдера конфигурации XML (источник на github, ссылка nuget). Но имейте в виду, что он будет использоваться только как источник конфигурации - любая логика поведения вашего приложения должна быть реализована вами. Поставщик конфигурации не будет изменять "настройки" и устанавливать политики для ваших приложений, а только будет читать данные из файла.
Ответ 2
Можно использовать свой обычный System.Configuration
даже в .NET Core 2.0 в Linux. Попробуйте этот тестовый пример:
- Создана библиотека .NET Standard 2.0 (скажем,
MyLib.dll
)
- Добавлен пакет NuGet
System.Configuration.ConfigurationManager
v4.4.0. Это необходимо, поскольку этот пакет не включен в метапакет NetStandard.Library
v2.0.0 (надеюсь, что он изменится)
- Все ваши классы С#, полученные из
ConfigurationSection
или ConfigurationElement
, попадают в MyLib.dll
. Например, MyClass.cs
происходит от ConfigurationSection
, а MyAccount.cs
происходит от ConfigurationElement
. Детали реализации здесь выходят за рамки, но Google - ваш друг
- Создайте приложение .NET Core 2.0 (например, консольное приложение,
MyApp.dll
). Приложения .NET Core заканчиваются на .dll
, а не на .exe
в Framework.
- Создайте
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 (тестирование).
Ответ 3
Microsoft также выпустила пакет NuGet, который позволяет вам использовать классические конфигурационные файлы с .NET Core
https://www.nuget.org/packages/System.Configuration.ConfigurationManager