#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. Попробуйте этот тестовый пример:
- Создал библиотеку .NET Standard 2.0 (скажем
MyLib.dll
) - Добавлен пакет NuGet
System.Configuration.ConfigurationManager
версии 4.4.0. Это необходимо, поскольку на этот пакет не распространяется мета-пакетNetStandard.Library
версии 0.0 (я надеюсь, что это изменится) - Все ваши классы C # являются производными от
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 (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:
-
Вы можете использовать Microsoft.Расширения.Конфигурирование API с любым приложением .NET Core, а не только с ASP.NET Основное приложение. Посмотрите пример, приведенный по ссылке, который показывает, как читать конфигурации в консольном приложении.
-
В большинстве случаев источник JSON (считываемый как
.json
файл) является наиболее подходящим источником конфигурации.Примечание: не смущайтесь, когда кто-то говорит, что файл конфигурации должен быть
appsettings.json
. Вы можете использовать любое подходящее вам имя файла, и расположение файла может быть другим — конкретных правил нет.Но, поскольку реальный мир сложен, существует множество разных поставщиков конфигурации:
- Форматы файлов (INI, JSON и XML)
- Аргументы командной строки
- Переменные среды
и так далее. Вы даже можете использовать / написать собственный поставщик.
-
На самом деле
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.