xUnit テストプロジェクトに Windows Formプロジェクトの参照を追加すると 「プロジェクト '*.csproj' は 'net5.0-windows' を対象にしています。'.NETCoreApp,Version=v5.0' を対象とするプロジェクトからは参照できません。」 エラーが発生する - Visual Studio

xUnit テストプロジェクトに Windows Formプロジェクトの参照を追加すると 「プロジェクト '*.csproj' は 'net5.0-windows' を対象にしています。'.NETCoreApp,Version=v5.0' を対象とするプロジェクトからは参照できません。」 エラーが発生する現象と対処法について紹介します。

現象

xUnitテストプロジェクトに .NET 5.0 のWindows Formプロジェクトの参照を追加すると、以下のエラーが発生します。
エラーメッセージ
コード:NU1201
プロジェクト '*.csproj' は 'net5.0-windows' を対象にしています。'.NETCoreApp,Version=v5.0' を対象とするプロジェクトからは参照できません。
英語でのエラーメッセージは下記です。
Error Message
Code:NU1201
Project '..' targets 'net5.0'. It cannot be referenced by a project that targets '.NETCoreApp,Version=v5.0'

原因

Windows Form アプリケーションはターゲットフレームワークがWindows プラットフォーム委依存している net5.0-windows が設定されています。 一方、xUnitテストプロジェクトはプラットフォームに依存しない net5.0 の設定となっているため、プラットフォームに依存しないアプリケーションから プラットフォームに制約のあるアプリケーションを参照しようとしてエラーが発生します。

対処法

テストプロジェクトのターゲットフレームワークをnet5.0-windows に変更します。

ターゲットフレームワークの確認

プロジェクトファイルを開いて、ターゲットフレームワークの設定を確認します。
[ソリューション エクスプローラー]のウィンドウのツリービューでWindows Formアプリケーションのプロジェクトのノードを選択して右クリックします。 ポップアップメニューが表示されます。メニューの[プロジェクト ファイルの編集]の項目をクリックします。


エディタ画面にプロジェクトファイルのXMLが表示されます。


コードは下記です。(プロジェクトの設定等で若干異なる場合があります。)
WindowsFormアプリケーションの .csproj ファイル
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

</Project>

続いてテストプロジェクトのプロジェクト設定を確認します。[ソリューション エクスプローラー]のツリービューで テストプロジェクトのノードをクリックして選択し、右クリックします。ポップアップメニューが表示されますので、 [プロジェクト ファイルの編集]の項目をクリックします。


プロジェクトファイルのコードがエディタ画面に表示されます。


コードは下記です。(プロジェクトの設定等で若干異なる場合があります。)
xUnitテストアプリケーションの .csproj ファイル
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
    <PackageReference Include="xunit" Version="2.4.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="coverlet.collector" Version="3.0.2">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\xUnitTestSimple\xUnitTestSimple.csproj" />
  </ItemGroup>

</Project>

修正方法

xUnitテストアプリケーションの TargetFramework タグの値を "net5.0" から "net5.0-windows" に変更します。
xUnitテストアプリケーションの .csproj ファイル PropertyGroupタグ部分 (変更前)
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>
xUnitテストアプリケーションの .csproj ファイル PropertyGroupタグ部分 (変更後)
  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>


動作の確認

プロジェクトファイル変更後、プロジェクトをビルドしてエラーが解消されたことを確認します。


xUnitテストプロジェクトから、.NET 5.0 のWindows フォームアプリケーションを参照できました。
補足
.NET Framework を利用したWindows Formやクラスライブラリの場合は、「xUnitテストプロジェクト」や「MSTestプロジェクト」は利用できません。 .NET Frameworkプロジェクトの場合は、「NUnitテストプロジェクト」、または、MSTestを利用している「単体テスト プロジェクト(.NET Framework)」を選択して、 ターゲットフレームワークを.NET Framework に設定します。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-08-22
iPentec all rights reserverd.