从引用 .NET Standard 库的 .NET Core 应用程序中的 app.config 读取
Reading from app.config in .NET Core application referencing .NET Standard library
我正在将一些现有代码从 .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 集合时,我只看到一个似乎是 SQL Express 连接的定义,可能来自 Machine.Config 文件。
有没有人成功地从 .NET Core 应用程序访问 App.Config,通过带有 ConfigurationManager 兼容性库的 .NET Standard 库?
在 Microsoft.Net.Test.Sdk 中仍然有一个已知的 issue,这是因为当您在中使用 ConfigurationManager使用 .Net Core 测试应用程序,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);
例如,要阅读应用设置,您可以这样做:
var setting = Config.AppSettings.Settings[key];
我正在将一些现有代码从 .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 集合时,我只看到一个似乎是 SQL Express 连接的定义,可能来自 Machine.Config 文件。
有没有人成功地从 .NET Core 应用程序访问 App.Config,通过带有 ConfigurationManager 兼容性库的 .NET Standard 库?
在 Microsoft.Net.Test.Sdk 中仍然有一个已知的 issue,这是因为当您在中使用 ConfigurationManager使用 .Net Core 测试应用程序,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);
例如,要阅读应用设置,您可以这样做:
var setting = Config.AppSettings.Settings[key];