rksoftware

Visual Studio とか C# とかが好きです

.NET Core 3.0 デスクトップアプリプロジェクトがビルドできない

.NET Core 3.0 のデスクトップアプリが次のコンパイルエラーでビルドできなくなることがあります。

重大度レベル コード 説明 プロジェクト ファイル 行 Suppression State
エラー MC1003 Project file cannot specify more than one ApplicationDefinition element. XXXXXX X:\XXXXXX\dotnet\sdk\3.0.100-preview-009812\Sdks\Microsoft.NET.Sdk.WindowsDesktop\targets\Microsoft.WinFX.targets

重大度レベル コード 説明 プロジェクト ファイル 行 Suppression State
エラー BG1003 The project file contains a property value that is not valid. XXXXXX X:\XXXXXX\dotnet\sdk\3.0.100-preview-009812\Sdks\Microsoft.NET.Sdk.WindowsDesktop\targets\Microsoft.WinFX.targets

■ 原因

今回エラーとなった原因は、最新の Preview 版で .csproj のフォーマットが変更されたことでした。 以前の alpha バージョンの .NET Core 3.0 で作成した .csproj と 現時点の最新の Preview バージョンの .csproj のフォーマットの例を挙げてみます。

alpha 版の例

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

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ApplicationDefinition Include="App.xaml" />
    <Page Include="MainWindow.xaml" />
  </ItemGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.DesktopUI" />
  </ItemGroup>

</Project>

最新の Preview 版の例

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

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

</Project>

古い形式の .csproj ではそもそも Visual Studio でプロジェクトを開くことができません。Project Sdk= 属性と <UseWPF>true</UseWPF> などを変更・追加し、新し形式に合わせることで Visual Studio で開けるようになります。
つまり

  <ItemGroup>
    <ApplicationDefinition Include="App.xaml" />
    <Page Include="MainWindow.xaml" />
  </ItemGroup>

の記述があっても、プロジェクトは開きます。しかし上記のエラー発生します。

■ 対策

.csproj の新しい形式に合わせて

  <ItemGroup>
    <ApplicationDefinition Include="App.xaml" />
    <Page Include="MainWindow.xaml" />
  </ItemGroup>

の記述も削除し、新しいフォーマットの .csproj に書き換えることで解決し、ビルド。実行できるようになりました。