从.NET Core应用程序中的app.config读取引用.NET标准库

时间:2018-05-25 13:01:48

标签: .net-core mstest .net-standard

我正在将一些现有代码从.NET Framework转换为.NET Standard,以便在.NET Core应用程序中使用。图书馆项目已经转换完毕并且正在建设中。它包含一些使用EF Core的数据库访问代码。由于此代码的消费者的遗留性质,我想继续使用App.Config或Web.Config文件与Configuration Manager。为此,我将System.Configuration.ConfigurationManager NuGet包添加到库项目中。

使用MSTest的单元测试项目验证库。该项目的目标是.NET Framework 4.7.1,它可以使用.NET Standard 2.0库包。当面向.NET Framework时,所有单元测试都在通过。

将单元测试项目更改为目标.NET Core 2.0后,数据库代码将无法再找到存储在单元测试项目的App.Config文件中的连接字符串。当我调试测试并检查ConfigurationManager.ConnectionStrings集合时,我只看到一个似乎是可能来自Machine.Config文件的SQL Express连接。

有没有人成功通过带有ConfigurationManager兼容性库的.NET标准库从.NET Core应用程序访问App.Config?

1 个答案:

答案 0 :(得分:2)

Microsoft.Net.Test.Sdk 中仍有一个已知的issue,这是因为在使用.Net Core的测试应用程序中使用 ConfigurationManager 时, ConfigurationManager 正在寻找 testhost.dll.config ,而不是标准的程序集配置文件。

基于this discussion in github,您可以将 App.Config 文件复制到名为 testhost.dll.config的输出目录中,这是一个非常令人愉快的解决方法。 将此元素放在测试csproj文件中:

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\testhost.dll.config" />
</Target>

然后您可以使用 ConfigurationManager.OpenMappedExeConfiguration 来加载配置文件。

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = "testhost.dll.config";

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

例如,阅读appsetting,你可以这样做:

var setting = Config.AppSettings.Settings[key];