Using app.config in .Net Core
It is possible to use your usual System.Configuration
even in .NET Core 2.0 on Linux. Try this test example:
- Created a .NET Standard 2.0 Library (say
MyLib.dll
) - Added the NuGet package
System.Configuration.ConfigurationManager
v4.4.0. This is needed since this package isn't covered by the meta-packageNetStandard.Library
v2.0.0 (I hope that changes) - All your C# classes derived from
ConfigurationSection
orConfigurationElement
go intoMyLib.dll
. For exampleMyClass.cs
derives fromConfigurationSection
andMyAccount.cs
derives fromConfigurationElement
. Implementation details are out of scope here but Google is your friend. - Create a .NET Core 2.0 app (e.g. a console app,
MyApp.dll
). .NET Core apps end with.dll
rather than.exe
in Framework. - Create an
app.config
inMyApp
with your custom configuration sections. This should obviously match your class designs in #3 above. For example:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="myCustomConfig" type="MyNamespace.MyClass, MyLib" />
</configSections>
<myCustomConfig>
<myAccount id="007" />
</myCustomConfig>
</configuration>
That's it - you'll find that the app.config is parsed properly within MyApp
and your existing code within MyLib
works just fine. Don't forget to run dotnet restore
if you switch platforms from Windows (dev) to Linux (test).
Additional workaround for test projects
If you're finding that your App.config
is not working in your test projects, you might need this snippet in your test project's .csproj
(e.g. just before the ending </Project>
). It basically copies App.config
into your output folder as testhost.dll.config
so dotnet test
picks it up.
<!-- 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 -->
You can use Microsoft.Extensions.Configuration API with any .NET Core app, not only with ASP.NET Core app. Look into sample provided in the link, that shows how to read configs in the console app.
In most cases, the JSON source (read as
.json
file) is the most suitable config source.Note: don't be confused when someone says that config file should be
appsettings.json
. You can use any file name, that is suitable for you and file location may be different - there are no specific rules.But, as the real world is complicated, there are a lot of different configuration providers:
- File formats (INI, JSON, and XML)
- Command-line arguments
- Environment variables
and so on. You even could use/write a custom provider.
Actually,
app.config
configuration file was an XML file. So you can read settings from it using XML configuration provider (source on github, nuget link). But keep in mind, it will be used only as a configuration source - any logic how your app behaves should be implemented by you. Configuration Provider will not change 'settings' and set policies for your apps, but only read data from the file.
I have a .Net Core 3.1 MSTest project with similar issue. This post provided clues to fix it.
Breaking this down to a simple answer for .Net core 3.1:
- add/ensure nuget package: System.Configuration.ConfigurationManager to project
- add your app.config(xml) to project.
If it is a MSTest project:
rename file in project to testhost.dll.config
OR
Use post-build command provided by DeepSpace101