100

I have problem. I need to write a program in .Net Core(C#) which use app.config like this:

<?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>

and I write:

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

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

and it is example from the internet so I thought would work, but I am getting exceptions:

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).

I downloaded via NuGet - Install-Package CoreCompat.System.Configuration -Version 4.2.3-r4 -Pre and still don't work. Maybe someone can help me?

4
  • 3
    In .NET Core you use appsettings.json, not app.config. Commented Jul 11, 2017 at 12:02
  • 1
    but I said about .Net Core and not ASP.Net core Commented Jul 11, 2017 at 12:20
  • 5
    Microsoft has also released a NuGet package that allows you to use classic config files with .NET Core nuget.org/packages/System.Configuration.ConfigurationManager Commented May 21, 2019 at 19:05
  • This might be relevant to future visitors. stackoverflow.com/a/50572248/897326 Commented Jan 20, 2023 at 13:30

5 Answers 5

101

It is possible to use your usual System.Configuration even in .NET Core 2.0 on Linux. Try this test example:

  1. Created a .NET Standard 2.0 Library (say MyLib.dll)
  2. Added the NuGet package System.Configuration.ConfigurationManager v4.4.0. This is needed since this package isn't covered by the meta-package NetStandard.Library v2.0.0 (I hope that changes)
  3. All your C# classes derived from ConfigurationSection or ConfigurationElement go into MyLib.dll. For example MyClass.cs derives from ConfigurationSection and MyAccount.cs derives from ConfigurationElement. Implementation details are out of scope here but Google is your friend.
  4. 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.
  5. Create an app.config in MyApp 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).

Also, the location of app.config at runtime is different than what was in .net framework, instead of "projectName.exe.config". It is now "projectName.dll.config" in .net core.

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 -->
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you for the test project workaround! Might be worth adding, if the test project is separate from the main project, you can copy App.config from the main project, to avoid having a duplicate copy in the test project. Just copy from ..\MainProject\App.config in the above, instead of from App.config.
This is a hack fix and it bothers me that so many people find hack fixes like this acceptable. I am not looking to maintain custom Configuration Managers.
51
  1. 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.

  2. 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.

  3. 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.

Comments

20

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

1 Comment

This worked for me, but I had to copy manually testhost.dll.config to the bin folder
3

I didn't want to import further dependencies, so settled on the following:

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();
    }
}

Just mapping ConfigurationManager.AppSettings to MemoryConfigurationSource.

Comments

3

For anyone who cares, you can just

dotnet add package System.Configuration.ConfigurationManager --version 8.0.0

Will get you functionality you need in a .NET Core 8 project.

NOTE: You may run into conflicts if you're using System.Extensions.Configuration for JSON settings files. For that you might have to apply the full namespace or a variable.

 string path = System.Configuration.ConfigurationManager.AppSettings["REMOTE_RELEASES_FILE"] ?? "";

var appSettings = System.Configuration.ConfigurationManager.AppSettings;
            
oauth = new OAuth(appSettings["oauth_token_" + environment] ?? "",
                    appSettings["oauth_token_secret_" + environment] ?? "",
                    appSettings["oauth_consumer_key_" + environment] ?? "",
                    appSettings["oauth_consumer_secret_" + environment] ?? "",
                    appSettings["resource_url"] ?? "",
                    appSettings["oauth_version"] ?? "",
                    appSettings["oauth_signature_method"]?? "");

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.