👔

WinUI 3 アプリで WinForms の機能を利用する

2024/01/28に公開

はじめに

本稿執筆時点では、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