在 .Net Core 中使用 app.config

Posted

技术标签:

【中文标题】在 .Net Core 中使用 app.config【英文标题】:Using app.config in .Net Core 【发布时间】:2017-12-15 11:37:24 【问题描述】:

我有问题。我需要在 .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=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 -Pre 下载,但仍然无法正常工作。也许有人可以帮助我?

【问题讨论】:

我认为对于 .net 核心,您将使用 json 文件进行配置。看看那个。 在 .NET Core 中使用 appsettings.json,而不是 app.config。 但我说的是 .Net Core 而不是 ASP.Net core “这是来自互联网的示例,所以我认为可以” - 有史以来最大的误解。 微软还发布了一个 NuGet 包,允许您在 .NET Core 中使用经典配置文件nuget.org/packages/System.Configuration.ConfigurationManager 【参考方案1】:

即使在 Linux 上的 .NET Core 2.0 中,也可以使用常用的 System.Configuration。试试这个测试示例:

    创建了一个 .NET Standard 2.0 库(比如MyLib.dll) 添加了 NuGet 包System.Configuration.ConfigurationManager v4.4.0。这是必需的,因为元包 NetStandard.Library v2.0.0 未涵盖此包(我希望有所改变) 从ConfigurationSectionConfigurationElement 派生的所有C# 类都进入MyLib.dll。例如,MyClass.cs 派生自 ConfigurationSectionMyAccount.cs 派生自 ConfigurationElement。实施细节超出了此处的范围,但Google is your friend。 创建一个 .NET Core 2.0 应用程序(例如一个控制台应用程序,MyApp.dll)。 .NET Core 应用以 .dll 结尾,而不是 Framework 中的 .exe。 使用您的自定义配置部分在MyApp 中创建一个app.config。这显然应该与上面#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 中的现有代码也可以正常工作。如果您将平台从 Windows(开发)切换到 Linux(测试),请不要忘记运行 dotnet restore

测试项目的其他解决方法

如果您发现您的 App.config 在您的测试项目中不起作用,您可能需要在您的测试项目的 .csproj 中使用这个 sn-p(例如,就在结尾 &lt;/Project&gt; 之前)。它基本上将App.config 复制到您的输出文件夹中,作为testhost.dll.config 以便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 -->

【讨论】:

这应该是正确的答案,如果可以绕过这个琐碎的事情,从 .NET Framework 迁移到 .NET core 将会更快更容易【参考方案2】:

    您可以将 Microsoft.Extensions.Configuration API 与 any .NET Core 应用程序一起使用,而不仅仅是 ASP.NET Core 应用程序。 查看链接中提供的示例,该示例显示了如何在控制台应用程序中读取配置。

    在大多数情况下,JSON 源(读作.json 文件)是最合适的配置源。

    注意:当有人说配置文件应该是appsettings.json 时,不要混淆。您可以使用任何适合您的文件名,并且文件位置可能不同 - 没有特定规则。

    但是,由于现实世界很复杂,所以有很多不同的配置提供者:

    文件格式(INI、JSON 和 XML) 命令行参数 环境变量

    等等。您甚至可以使用/编写自定义提供程序。

    实际上,app.config 配置文件是一个 XML 文件。因此,您可以使用 XML 配置提供程序(source on github、nuget link)从中读取设置。但请记住,它将仅用作配置源 - 您的应用程序行为方式的任何逻辑都应由您实现。配置提供程序不会更改“设置”并为您的应用设置策略,而只会从文件中读取数据。

【讨论】:

【参考方案3】:

我有一个有类似问题的 .Net Core 3.1 MSTest 项目。这篇文章提供了修复它的线索。

将其分解为 .Net core 3.1 的简​​单答案:

添加/确保 nuget 包:System.Configuration.ConfigurationManager 到项目 将您的 app.config(xml) 添加到项目中。

如果是 MSTest 项目:

将项目中的文件重命名为 testhost.dll.config

使用 DeepSpace101 提供的构建后命令

【讨论】:

这对我有用,但我必须手动将 testhost.dll.config 复制到 bin 文件夹

以上是关于在 .Net Core 中使用 app.config的主要内容,如果未能解决你的问题,请参考以下文章

[VS] [C#] 替项目加入 log4net 吧~

.net core系列之《.net core中使用MySql以及Dapper》

ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用AutoMapper进行实体映射

如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

在.NET Core中使用MEF