[C#] 資産ファイル 'project.assets.json' に 'net48/win7-x64' のターゲットがありませんというエラーの対処方法

2024-04-24 (水)

新しい SDK 形式の csproj で .NET Framework 4.8 を対象にしているプロジェクトで、RuntimeIdentifiers に関するビルドエラーが発生しました。その対処方法を記載します。

環境

  • .NET 8.0.4 (SDK 8.0.204)
  • C# 12.0
  • Visual Studio 2022 Version 17.9.6
  • Windows 11 Pro 22H2 22631.3447

前提

以下のようなエラーが発生した場合の対処方法です。
Visual Studio 上ではビルドは成功しますが、MSBuild CLI でソリューションをビルドしたところエラーが発生しました。

C:\Program Files\dotnet\sdk\8.0.204\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(266, 5): error NETSDK1047: 資産ファイル ‘C:\xxx\SampleProject\obj\project.assets.json’ に ’net48/win7-x64’ のターゲットがありません。復元が実行されたこと、および ’net48’ がプロジェクトの TargetFrameworks に含まれていることを確認してください。プロジェクトの RuntimeIdentifiers に ‘win7-x64’ を組み込む必要が生じる可能性もあります。 [C:\xxx\SampleProject\SampleProject.csproj]

C:\Program Files\dotnet\sdk\8.0.204\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(266, 5): error NETSDK1047: Assets file ‘C:\xxx\SampleProject\obj\project.assets.json’ doesn’t have a target for ’net48/win7-x64’. Ensure that restore has run and that you have included ’net48’ in the TargetFrameworks for your project. You may also need to include ‘win7-x64’ in your project’s RuntimeIdentifiers. [C:\xxx\SampleProject\SampleProject.csproj]

結果

  • 💡 <RuntimeIdentifier> または複数指定の <RuntimeIdentifiers> を追加することでエラーを解消できます。
  • ❗[重要] 設定後に obj フォルダを削除してください!

エラーが発生する csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>

</Project>

エラーメッセージに従い対処した csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net48</TargetFramework>
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
  </PropertyGroup>

</Project>

x86 と x64 両方を対象にする場合の csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net48</TargetFramework>
    <RuntimeIdentifiers>win7-x86;win7-x64</RuntimeIdentifiers>
    <Platforms>x64;x86</Platforms>
  </PropertyGroup>

</Project>
  • <RuntimeIdentifiers> 複数指定する場合はタグ名の最後に s が付きます。; 区切りで複数指定します。
  • <Platforms> ソリューションの構成マネージャーに合わせて設定した例です。

❗[重要] 設定後に obj フォルダを削除してから、ビルドしなおしてください!

感謝

2024-04-24 (水)