WinUI 3 アプリで WinForms の機能を利用する
はじめに
本稿執筆時点では、WinUI 3 アプリで Windows フォーム(WinForms)の機能(例:マルチディスプレイ)を利用しようとすると、ビルド時にエラーが発生しますので、その解決方法です。
サンプルプログラムのソースコードは GitHub に上げてあります(注意事項は後述)。
症状
Template Studio for WinUI で新しいソリューションを作成し、プロジェクトのプロパティーで「このプロジェクトで Windows フォームを有効にします」をオンにすると、ビルド時に MC6000 エラーが発生します。
MC6000 プロジェクト ファイルは、.NET Framework アセンブリ 'PresentationCore, PresentationFramework' を参照一覧に含んでいなければなりません。
解決方法
WinUI 3 プロジェクトだと WinForms と競合が発生しますが、そうでないプロジェクトであれば競合しないので、ダミーの別プロジェクトを作ります。
WinForms の無効化
プロジェクトのプロパティーで「このプロジェクトで Windows フォームを有効にします」をオフに戻します。
空プロジェクトの作成
ソリューションの中で、メインプロジェクトとは別のプロジェクトを新規に作成します。
デフォルトの中身は不要なので、なるべく空に近いテンプレートでプロジェクトを作成します。今回は「クラスライブラリ」にしました。
今回はメインプロジェクトを「TestWinUi3WinForms」にしたので、空プロジェクトの名称は「TestWinUi3WinForms.WinForms」にしました。デフォルトで作成されるプロジェクトの中身(Class1.cs)は削除します。
ソリューションの構成は以下のようになります。
ソリューション TestWinUi3WinForms
├── TestWinUi3WinForms(メインプロジェクト)
├── TestWinUi3WinForms.WinForms(WinForms プロジェクト用の空プロジェクト)
└── その他のプロジェクト
空プロジェクトの設定
空プロジェクトで WinForms を有効化します。
空のプロジェクトをダブルクリックによりテキストモードで開き(プロパティーではなく)、
-
<TargetFramework>
の変更 -
<UseWindowsForms>
の追加
を行います。
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>True</UseWindowsForms>
</PropertyGroup>
空プロジェクトをクラスライブラリで作成した場合、<TargetFramework>
の末尾に「-windows」が入っていないので追加します。
<UseWindowsForms>
は「このプロジェクトで Windows フォームを有効にします」と同義なので、プロパティー画面で設定しても構いません。
ここまでで、いったん空プロジェクトをビルドするほうがいいかもしれません。
WinForms 利用
メインプロジェクトで WinForms を利用するには、メインプロジェクトの「依存関係」からプロジェクト参照の追加をします。
参照マネージャーで TestWinUi3WinForms.WinForms プロジェクトを追加します。
以上で WinForms の機能を利用できるようになります。
using System.Windows.Forms;
MessageBox.Show("画面の数:" + Screen.AllScreens.Length);
サンプルプログラム
サンプルプログラム(GitHub に上げてあります)を実行すると、画面の数を取得します。
注意事項
GitHub からダウンロードしたソリューションを開くと、構成マネージャーに「Any CPU」が追加されている場合があります。
その状態でビルドすると
CS0006 メタデータ ファイル 'X:\~\TestWinUi3WinForms.WinForms.dll' が見つかりませんでした
というエラーになりますので、Any CPU を削除してからビルドしてください。
確認環境
項目 | 環境 |
---|---|
OS | Windows 11 Pro 23H2 |
Visual Studio | 2022 17.8.5 |
Template Studio for WinUI | 5.5 |
.NET | 8.0 |
Windows App SDK | 1.4.4 (1.4.231219000) |
Discussion