.net core 从.NET核心应用程序中引用.NET标准库的app.config读取

.net core 从.NET核心应用程序中引用.NET标准库的app.config读取,.net-core,mstest,.net-standard,.net Core,Mstest,.net Standard,我正在将一些现有代码从.NET Framework转换为.NET标准,以便在.NET核心应用程序中使用。该图书馆项目已移交,正在建设中。它包含一些使用EF核心的数据库访问代码。由于这段代码的使用者的遗留性质,我想继续在Configuration Manager中使用App.Config或Web.Config文件。为此,我将System.Configuration.ConfigurationManager NuGet包添加到库项目中 该库通过使用MSTest的单元测试项目进行验证。该项目的目标是.

我正在将一些现有代码从.NET Framework转换为.NET标准,以便在.NET核心应用程序中使用。该图书馆项目已移交,正在建设中。它包含一些使用EF核心的数据库访问代码。由于这段代码的使用者的遗留性质,我想继续在Configuration Manager中使用App.Config或Web.Config文件。为此,我将System.Configuration.ConfigurationManager NuGet包添加到库项目中

该库通过使用MSTest的单元测试项目进行验证。该项目的目标是.NET Framework 4.7.1,它可能会使用.NET标准2.0库包。当以.NETFramework为目标时,所有的单元测试都通过了

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

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

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
是否有人通过带有ConfigurationManager兼容性库的.NET标准库从.NET Core应用程序成功访问App.Config?

Microsoft.NET.Test.Sdk中仍然存在一个已知的漏洞,这是因为在使用.NET Core的测试应用程序中使用ConfigurationManager时,ConfigurationManager正在查找的是testhost.dll.config,而不是您的标准程序集配置文件

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

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
这个问题有一个不好的解决方法,根据这个方法,您可以将App.Config文件复制到名为testhost.dll.Config的输出目录中,方法是将此元素放在您的test csproj文件中:

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\testhost.dll.config" />
</Target>
例如,对于读取应用程序设置,您可以这样做:

var setting = Config.AppSettings.Settings[key];
微软.Net.Test.Sdk中仍然存在一个已知的问题,这是因为当您在使用.Net Core的测试应用程序中使用ConfigurationManager时,ConfigurationManager正在寻找testhost.dll.config而不是您的标准程序集配置文件

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

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
这个问题有一个不好的解决方法,根据这个方法,您可以将App.Config文件复制到名为testhost.dll.Config的输出目录中,方法是将此元素放在您的test csproj文件中:

<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
    <Copy SourceFiles="App.config" DestinationFiles="$(OutDir)\testhost.dll.config" />
</Target>
例如,对于读取应用程序设置,您可以这样做:

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

添加复制目标可以在本地运行单元测试。我还没有尝试在TFS构建服务器上运行它,但是由于它也使用MSTest,所以它的行为应该是相同的。谢谢。我使用当前文件| new | visualc | | | | |.net core | mstest项目进行了测试,如果我添加了一个App.config,我发现它会在生成过程中自动作为.dll.config放入$(OutDir),正如您在.net框架项目中所期望的那样,并且您可以使用
$“{Assembly.GetExecutingAssembly().GetName().Name}”.dll.config“
添加复制目标使其能够在本地运行单元测试。我还没有尝试在TFS构建服务器上运行它,但是由于它也使用MSTest,所以它的行为应该是相同的。谢谢。我使用当前文件| new | visualc | | | | |.net core | mstest项目进行了测试,如果我添加了一个App.config,我发现它会在生成过程中自动作为.dll.config放入$(OutDir),正如您在.net框架项目中所期望的那样,并且您可以使用
$“{Assembly.GetExecutingAssembly().GetName().Name}”.dll.config“