【问题标题】:Reading from app.config in .NET Core application referencing .NET Standard library从引用 .NET Standard 库的 .NET Core 应用程序中的 app.config 读取
【发布时间】:2018-11-04 21:25:24
【问题描述】:

我正在将一些现有代码从 .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 连接。

有没有人通过 .NET Standard 库和 ConfigurationManager 兼容性库成功地从 .NET Core 应用访问 App.Config?

【问题讨论】:

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


    【解决方案1】:

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

    有一个基于this discussion in github 的不愉快的解决方法,您可以将 App.Config 文件复制到名为 testhost.dll.config 的输出目录中strong> 将此元素放入您的测试 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];
    

    【讨论】:

    • 添加复制目标使其可以在本地运行单元测试。我还没有尝试在 TFS 构建服务器上运行它,但由于它也使用 MSTest,它的行为应该相同。谢谢。
    • 我用当前文件测试过 |新 |视觉c# | .net 核心 | mstest 项目,如果我添加一个 App.config,我发现它会在构建过程中自动放入 $(OutDir) 作为 .dll.config,正如您在 .net 框架项目中所期望的那样指向 ExeConfigFile 并使用 $"{Assembly.GetExecutingAssembly().GetName().Name}.dll.config"
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2020-02-09
    相关资源
    最近更新 更多