既存の WPF .NET Core を .NET5 に変更したらビルドエラー【.NET Core WPF Prism MVVM 入門 2020】
2020/11/10 に .NET5 がリリースされて 1 か月以上経ったので、現在連載中の .NET Core WPF Prism MVVM 入門 2020 で紹介しているサンプルアプリを .NET Core 3.1 から .NET5 に変更してみました。
.NET5 に変更してリビルドするとビルドエラーになったので、その際に調べた内容を簡単に紹介します。
目次
既存の .NET Core 3.1 WPF アプリを .NET5 に変更する
.NET5 に変更するのは現在連載中の .NET Core WPF Prism MVVM 入門 2020 で紹介しているサンプルアプリですが、連載を読んでいない人向けにソリューション構成を簡単に紹介します。サンプルアプリは fig. 1 のように 6 個のプロジェクトを含むソリューションです。
それぞれは以下のようなプロジェクトです。
プロジェクト名 | 内容 |
---|---|
PrismSample | 唯一の実行可能プロジェクト。Prism の Blank App テンプレートから作成。 スタートアップ Window を含む。 |
PrismMvvm | Prism の Module テンプレートから作成したクラスライブラリプロジェクト。動的に Load する部分 View(UserControl)を含む。 |
ReactiveMvvm | Prism の Module テンプレートから作成したクラスライブラリプロジェクト。動的に Load する部分 View(UserControl)を含む。 |
SampleAppLogics | .NET Core のクラスライブラリプロジェクトから作成。UI 関連の参照は無し。 |
SampleDataAccess | .NET Core のクラスライブラリプロジェクトから作成。UI 関連の参照は無し。 |
SampleModels | .NET Core のクラスライブラリプロジェクトから作成。UI 関連の参照は無し。 |
上記のソリューションを .NET5 に変更します。
ターゲットフレームワークを .NET5 に変更
.NET5 で開発するには Visual Studio 2019 Ver. 16.8.0 以降が必要なので、まずは VS 2019 を最新版に更新しておきます。
.NET5 は .NET Core の系譜なので .NET Core 3.x で作成しているプロジェクトであれば、fig. 2 のように【プロジェクトのプロパティ】で【対象のフレームワーク】を変更するだけです。
複数プロジェクトを一括で変更できる方法があるのかもしれませんが、管理人は全て手作業で変更しました。全プロジェクトの【対象のフレームワーク】を変更し終わったらリビルドします。
.NET5 に変更後のビルドメッセージ
ソリューションをリビルドすると以下のようなビルドメッセージが出力されます。
エラー『error NETSDK1136: Windows フォームまたは WPF を使用しているとき、またはそのようなプロジェクトまたはパッケージを参照しているときには、ターゲット プラットフォームを Windows に設定する必要があります (通常は TargetFramework プロパティに ‘-windows’ を含めることによる)。』 警告『warning NETSDK1137: Microsoft.NET.Sdk.WindowsDesktop SDK を使用する必要はなくなりました。ルート プロジェクト要素の SDK 属性を ‘Microsoft.NET.Sdk’ に変更することをご検討ください。』以下がビルド結果です。
プロジェクト名 | ビルド結果 | ビルドメッセージ |
---|---|---|
PrismSample | 失敗 | 警告 |
PrismMvvm | 失敗 | 警告 |
ReactiveMvvm | 失敗 | 警告 |
SampleAppLogics | 失敗 | エラー |
SampleDataAccess | 失敗 | エラー |
SampleModels | 失敗 | エラー |
太字のプロジェクトは参照しているクラスライブラリプロジェクトのビルドが失敗している事が原因なので、警告への対応だけで良さそうです。
プロジェクトファイルを編集する
表示された 2 つのビルドメッセージはどちらもプロジェクトファイルの編集が必要なので、まずは fig. 3 のようにソリューションエクスプローラーの右クリックメニューから実行可能プロジェクト(PrismSample)のプロジェクトファイルを開きます。
src. 1 はプロジェクトファイルの中身です。
1 2 3 4 5 6 7 8 9 | <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net5.0-windows</TargetFramework> <UseWPF>true</UseWPF> <AssemblyName>PrismSample</AssemblyName> </PropertyGroup> ~ 略 ~ </Project> |
PrismSample プロジェクトを始めとする UI 系プロジェクトは警告メッセージだけなので、1 行目を src. 2 のように変更します。
1 2 3 4 5 6 7 8 9 | <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net5.0-windows</TargetFramework> <UseWPF>true</UseWPF> <AssemblyName>PrismSample</AssemblyName> </PropertyGroup> ~ 略 ~ </Project> |
上記の修正を警告が出力されている全てのプロジェクトに反映すると警告への対応は完了です。
.NET5 ビルドエラーの対応
残るビルドエラーは、エラー番号(NETSDK1136)で検索すればすぐに見つかりますが、GitHub の dotnet / sdk Issue #14297 に対応が上がっています。
上のIssue に回答は付いていますが『Developer Community 見れ』と書かれているだけで既に Close されています…
Issue に書かれている Developer Community に飛ぶとプロジェクトファイルを編集するように書かれているので、開いた【ビルドエラープロジェクト(例:SampleAppLogics)】のプロジェクトファイルが src. 3 です。
1 2 3 4 5 6 7 | <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <RootNamespace>PrismSample</RootNamespace> </PropertyGroup> ~ 略 ~ </Project> |
Developer Community には【TargetFramework】を修正するように書かれているので、src. 3 の 3 行目を src. 4 のように修正します。
1 2 3 4 5 6 7 | <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0-windows</TargetFramework> <RootNamespace>PrismSample</RootNamespace> </PropertyGroup> ~ 略 ~ </Project> |
src. 4 のように【TargetFramework】の末尾に【-windows】を追加する修正を、ビルドエラーになっている全プロジェクトファイルに対して行えば全てのビルドが正常に通るようになりますが、最初この対応は管理人的にかなり納得できませんでした。
尚、クラスライブラリ系プロジェクトの TargetFramework を【net5.0-windows】に変更するとプロジェクトのプロパティ画面が fig. 4 のようになるので GUI では変更できなくなります。
ビルドエラーのメッセージには『WPF や Windows Form 系のプロジェクトまたはパッケージを参照しているときには、ターゲット プラットフォームを Windows に設定』と出力されますが、該当プロジェクトは参照される側なので、UI 系のプロジェクトやパッケージ等は参照していないプレーンなクラスライブラリです。最初は VS かコンパイラのバグかとも思いましたが、.NET5 から【TargetFramework】の役割が変わったことが原因のようです。
プロジェクトファイルの TargetFramework
前章に書いた通りプロジェクトファイル内の【TargetFramework】の扱いが .NET5 から変更されたようです。公式では『SDK スタイルのプロジェクトでのターゲット フレームワーク – Microsoft Docs』や dotnet/designs の Target Framework Names in .NET 5 等に書かれています。
又【++C++; // 未確認飛行 C】管理者の岩永さんの記事 『.NET 5 の Target Framework と Optional SDK Workload』でも解説されています。(.NET5 Preview の時期に書かれた記事です)
詳しくは上で紹介した記事を読むのが1番だと思いますが、かい摘んで言うと以前の【TargetFramework】は .NET のバージョンを指定する場所でしたが、.NET5 からは『TargetFramework には .NET のバージョンだけでなく実行プラットフォームや実行プラットフォームのバージョンも指定するやで』と言う形に変わったようです。
そのため例え Windows 系の UI ライブラリを参照しない単純なクラスライブラリでも Windows アプリの一部として実行するなら、実行プラットフォームを表す【-windows】を追加する事が必要になったようです。変更自体はしょうがないですが、上で紹介した記事には WPF や Windows Form アプリのソリューションにぶら下がるクラスライブラリに対しての記述は見当たらなかった(管理人の見落としかもしれません)ので納得するのに時間がかかりました。
管理人の場合、上のドキュメントを読み込んで納得した訳ではなく、ソリューションの生成物を出力する fig. 5、6 のような bin フォルダの中身をたまたま見かけたからです。(デバッグモードなので bin\Debug フォルダ内)
fig. 5 は『PrismSample プロジェクト(実行可能プロジェクト)』、fig. 6 は『SampleAppLogics プロジェクト(クラスライブラリ)』の bin フォルダで、それぞれ【TargetFramework】に設定した文字列と同名のフォルダが作成されているのが分かると思います。そして fig. 5 はビルドエラーの対応で【TargetFramework】を変更したので『net5.0』から名前が始まるフォルダが 2 つ生成されています。
この自動生成されたフォルダを見た時『出力先フォルダ名が一致するファイルを集めたいからクラスライブラリプロジェクトでも【-windows】を付ける必要があるんだな』と納得してしまいました。(実際の Visual Studio ビルド仕様と合っているかは調べていません)
この変更で、クラスライブラリプロジェクトを追加する度に【-windows】を手作業で追加しなければならないので少し手間が増えますね…
まとめ的な…
このような経緯で .NET5 への変更も無事できましたし、軽く動作を確認した所、特に問題なく動作しているようだったので、今後 .NET Core WPF Prism MVVM 入門 2020で紹介するサンプルアプリは .NET5 で作成していく予定です。
.NET Core WPF Prism MVVM 入門 2020 の現時点(2020/12)で最新エントリの Step: 8 で紹介しているサンプルアプリは以下のように多くのパッケージを使用しています。
パッケージ名 | Version |
---|---|
Prism | Ver. 7.2.0.1422 |
MahApps.Metro | Ver. 2.2.0 |
Material Design In XAML Toolkit | Ver. 3.2.0 |
ReactiveProperty | Ver. 7.4.1 |
AutoMapper | Ver. 10.0.0 |
実際のソリューションには上記以外のパッケージも含まれていますが、どのパッケージも .NET5 で問題無く動作していると思うので、可能なら .NET5 への移行にチャレンジしても良さそうな感じです。(保証はできませんが…)
そして、今回のエントリで変換元にしたソリューションはリポジトリに上げませんが、既存の【07_Step08】ソリューション を変換元にして試すことができます。
このエントリで紹介したビルドエラーは、クラスライブラリプロジェクトが含まれていないソリューションでは恐らく発生しないはずなので、変換元にするソリューションの手持ちが無い場合は、上の【07_Step08】ソリューション で試してみてください。
2020 年締めの挨拶的な…
2020 年は 9 月中旬頃から連載記事を放置して新作アニメの放送予定一覧の作成に時間の大半を注ぎ込んでしまったので、技術系の記事はしばらく放置でしたが、今月(2020/12)中旬からパラダイスだった在宅勤務から出勤勤務に戻ってしまったので、来年からは連載記事にも時間を割こうと思っています。
年明けからすぐに以前のような 2 週間に 1 回新規記事を公開するようなペースに戻すとは言えませんが、徐々に公開ペースは戻していきたいと考えています。
と言う訳で連載記事ではなく番外編的な記事で 2020 年を締める形になってしまいましたが、来年早々にはまず .NET Core WPF Prism MVVM 入門 2020の Step: 9 を公開したいと思っているので、見捨てず来年もよろしくお願いします。
2020/12/24 :: halation ghost :: 管理人 妖精作戦