bugfix> net-core > 投稿

.NET Coreアプリで使用するために、既存のコードを.NET Frameworkから.NET Standardに変換しています。ライブラリプロジェクトは変換され、正常にビルドされています。 EF Coreを使用するデータベースアクセスコードが含まれています。このコードのコンシューマーの従来の性質により、Configuration ManagerでApp.ConfigまたはWeb.Configファイルを引き続き使用したかったのです。これを行うには、System.Configuration.ConfigurationManager NuGetパッケージをライブラリプロジェクトに追加しました。

ライブラリは、MSTestを使用する単体テストプロジェクトで検証されます。このプロジェクトは、.NET Framework 4.7.1を対象としており、.NET Framework 2.0ライブラリパッケージを消費する可能性がありました。 .NET Frameworkを対象とする場合、すべての単体テストに合格していました。

単体テストプロジェクトをターゲット.NET Core 2.0に変更すると、データベースコードは単体テストプロジェクトのApp.Configファイルに格納されている接続文字列を見つけることができなくなります。テストをデバッグしてConfigurationManager.ConnectionStringsコレクションを検査すると、Machine.ConfigファイルからのSQL Express接続であると思われる定義済みの1つのみが表示されます。

ConfigurationManager互換性ライブラリを備えた.NET標準ライブラリを通過する.NET CoreアプリからApp.Configにアクセスできた人はいますか?

回答 1 件
  • まだ既知の問題がありますMicrosoft.Net.Test.Sdk そしてそれはあなたが使うときConfigurationManager .Net Coreを使用したテストアプリケーションでは、ConfigurationManager を探しているtesthost.dll.config 標準のアセンブリ構成ファイルではありません。

    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];
    
    

あなたの答え