在.Net Core中使用app.config

时间:2017-07-11 11:59:40

标签: 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=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下载 - 安装 - 软件包CoreCompat.System.Configuration -Version 4.2.3-r4 -Pre仍然无法正常工作。也许有人可以帮助我?

4 个答案:

答案 0 :(得分:27)

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

  1. 创建了一个.NET Standard 2.0库(比如MyLib.dll
  2. 添加了NuGet包System.Configuration.ConfigurationManager v4.4.0。这是必需的,因为元包NetStandard.Library v2.0.0不包含这个包(我希望更改)
  3. ConfigurationSectionConfigurationElement派生的所有C#类都会进入MyLib.dll。例如,MyClass.cs派生自ConfigurationSectionMyAccount.cs派生自ConfigurationElement。实施细节不在此范围,但Google is your friend
  4. 创建.NET Core 2.0应用程序(例如控制台应用程序MyApp.dll)。 .NET Core应用程序以.dll结束,而不是在Framework中以.exe结束。
  5. 使用您的自定义配置部分在app.config中创建MyApp。这显然应该与上面#3中的班级设计相匹配。例如:
  6.    <?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(dev)切换到Linux(测试),请不要忘记运行dotnet restore

答案 1 :(得分:20)

  1. 您可以将Configuration API任何 .NET核心应用程序一起使用,而不仅仅是使用ASP.NET核心应用程序。 查看链接中提供的示例,其中显示了如何在控制台应用程序中阅读配置。

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

      

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

    但是,由于现实世界很复杂,因此有很多不同的配置提供商:

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

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

  3. 实际上,app.config配置文件是一个XML文件。因此,您可以使用XML配置提供程序(source on githubnuget link)从中读取设置。但请记住,它仅用作配置源 - 您的应用程序行为应该由您实现。配置提供商不会更改设置&#39;并为您的应用设置政策,但只读取文件中的数据。

答案 2 :(得分:10)

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

将其简化为.Net core 3.1的简单答案:

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

如果它是MSTest项目:

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

    OR

  • 使用DeepSpace101提供的构建后命令

答案 3 :(得分:-3)

要开始使用dotnet核心,SqlServer和EF核心,可以使用下面的DBContextOptionsBuilder,您无需创建App.config文件。不要忘记在下面的代码中更改服务器地址和数据库名称。

protected override void OnConfiguring(DbContextOptionsBuilder options)
        => options.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=TestDB;Trusted_Connection=True;");

要使用EF核心SqlServer提供程序并编译上面的代码,请安装EF SqlServer软件包

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

在编译后,运行代码之前,请首先进行以​​下操作

dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet ef migrations add InitialCreate
dotnet ef database update

运行代码

dotnet run