【.NET C# Windows Forms】ユーザーコントロールプロジェクトの作成

.NET 5.0以降の.NETで、.NET Frameworkで作っていたユーザーコントロールライブラリの作成方法を調べてみました。

最終的には下図のように、Formアプリケーション作成時のツールボックスに作成中のUserControlが表示される事を目標としてます。

まず、ユーザーコントロール用のプロジェクトを作成するため、ソリューションエクスプローラのソリューション名の部分を右クリックし、追加→新しいプロジェクト でユーザーコントロール用のプロジェクトを追加します。

しかし、ここでちょっとした不都合があり、プロジェクトのテンプレートにWindows フォームコントロールライブラリ(.NET Framework)はあるものの、Windows フォームコントロールライブラリ(.NET)が、ありません。

(2021.8.3) 新しいバージョンのVisual Studioでは Windows フォームコントロールライブラリが追加されました。そのためVisual Studioを更新し、Windows フォームコントロールライブラリを選択してコントロールライブラリを作成してください。

下図はVisual Studio Community 2019 Ver.16.10.4の画面です。


以下は旧バージョン時の説明です。

仕方がないので、Windows Forms App(.NET)を選択し次へをクリックします。
(最終的にユーザーコントロールライブラリに修正します)

次に表示されたウィンドウで、プロジェクト名に適当な名前を指定し、作成をクリックします。

作成したプロジェクト名を右クリックし、 追加 → ユーザーコントロール(Windowsフォーム) をクリックします。

今回は、名前をデフォルトのままにしていますが、適切なコントロールの名前を付けて追加をクリックします。

プロジェクト名を右クリックし、プロパティをクリックし、アプリケーションを出力の種類Windowsアプリケーション から クラスライブラリに変更します。
また、.NET(.NET5.0以降)のユーザーコントロールを作成する場合は、対象のフレームワークも.NET5.0に変更します。

出力の種類をクラスライブラリに変更した時点で、プロジェクトの作成時に作成されていたForm1.cs、Form1.Designer.cs、Form.resx、Program.csは必要なくなるので、削除しておきます。

これで、元々はWindows Formsアプリとして作成されたプロジェクトでしたが、.NET用のユーザーコントロールのプロジェクトとなりました。

このユーザーコントロールを使用する側のWindows Formsのプロジェクトの依存関係を右クリックし、プロジェクト参照の追加をクリックします。

次に表示されたユーザーコントロールのプロジェクト(ここではWindowsFormsApp2)にチェックを入れ、OKボタンをクリックします。

ここで一旦、ソリューションをビルドします。

これで、最初に示したように、ユーザーコントロールを使う側(参照元)のプロジェクトのフォームを表示すると、ツールボックスのウィンドウに作成したユーザーコントロールが表示されます。

 

(注意点)
ここでは、.NETのWindows Formsのプロジェクト(参照元)から、.NETのクラスライブラリのプロジェクト(参照先)を参照していますが、プロジェクトで設定している対象のフレームワークが、参照元のプロジェクトより、参照先のプロジェクトの方が新しいフレームワークを設定している場合、エラーになるので注意してください。

(参考)

【NU1201】プロジェクト XXX は XXX と互換性がありません。

 

 .NET 5 C# Windows Forms プログラム へ戻る

【NU1201】プロジェクト XXX は XXX と互換性がありません。

あるプロジェクトと、別のライブラリなどのプロジェクトに依存関係(プロジェクトの参照)がある場合、プロジェクトで設定している対象のフレームワークが、参照元のプロジェクトより、参照先のプロジェクトが新しい場合、以下のエラーコードが表示されます。

コード 説明
NU1201 プロジェクト XXX は XXX と互換性がありません。プロジェクト XXX がサポートするもの XXX

対象のフレームワークは

.NET 5.0 → .NET Core 3.1 → .NET Core 3.0 → .NET Framework

の順で、参照元のプロジェクトより、参照先のプロジェクトが同じか、右側にあるフレームワークである必要があります。

今のところ、 .NET 5.0 から .NET Framework のプロジェクトを参照する事も出来ますが、出来るだけ使用するフレームワークは合わせておいた方がいいでしょうね。

 

.NET 5 C# Windows Forms プログラム へ戻る

【NETSDK1137】Microsoft.NET.Sdk.WindowsDesktop SDKを使用する必要はなくなりました。

対象のフレームワークを .NET Core から .NET 5.0 を指定すると、以下のような警告が表示されます。

コード 説明
NETSDK1137 Microsoft.NET.Sdk.WindowsDesktop SDKを使用する必要は無くなりました。
ルートプロジェクト要素のSDK属性を’Microsoft.NET.SDK’に変更することをご検討ください。

 

そこで、プロジェクトファイル(*.csproj)をテキストエディタで開くか、Visual Studioで表示されているプロジェクト名をダブルクリックでプロジェクトファイル(*.csproj)を開き、 Project Sdk を

Microsoft.NET.Sdk.WindowsDesktop から Microsoft.NET.Sdk へ変更します。

 

具体的には

【修正前】

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
 <PropertyGroup>
 <OutputType>WinExe</OutputType>
 <TargetFramework>net5.0-windows</TargetFramework>
 <UseWindowsForms>true</UseWindowsForms>
 </PropertyGroup>
</Project>

【修正後】

<Project Sdk="Microsoft.NET.Sdk">
 <PropertyGroup>
 <OutputType>WinExe</OutputType>
 <TargetFramework>net5.0-windows</TargetFramework>
 <UseWindowsForms>true</UseWindowsForms>
 </PropertyGroup>
</Project>

のように修正します。

 

← .NET 5 C# Windows Forms プログラム へ戻る

.NET 5 正式版が公開されました

2020年11月11日(日本時間)、.NET5の正式版が公開されました!!

 

.NET5は以下のページよりダウンロードできます。

https://dotnet.microsoft.com/download/dotnet/5.0

 

対応のVisual Studio は Visual Studio 2019 Ver.16.8以降でこちらから入手できます。

すでにVisual Studio2019をインストール済みの場合、メニューの ヘルプ→更新プログラムの確認 よりアップデートしてください。

https://visualstudio.microsoft.com/ja/

 

(参考情報)

Announcing .NET 5.0

 

← .NET 5 C# Windows Forms プログラム へ戻る

.NET Frameworkから.NET5への移植作業(Windows Formsの場合)

.NET Frameworkで作成していたプログラムを.NET5への移植作業方法を手探りしながら調べているのですが、そのメモ状態の情報です。(随時、修正中です。)

そもそも、.NET5は従来の.NET Coreの流れを組んでいるため、.NET Frameworkで作成したプロジェクトのプロパティで、対象のフレームワーク.NET5 を選ぶ事ができません。

 

.NET Frameworkから.NET5に移行するにあたって、プロジェクトファイル(*.csproj)が大きく変更されています。このプロジェクトファイルを何とかすれば、移植が可能なようです。

 

そこで、移植評価のサンプルとして、私がよく使う構成の.NET Frameworkのプロジェクトを用意しました。

フォームには

  • ToolStripMenuItem
  • StatusStrip
  • SplitContainer
  • PictureBox
  • Label
  • TextBox
  • Button

を配置し、TextBoxのTextプロパティは前回の状態を保持できるように、PropertyBindingを設定しました。

 

移植作業は

  1. .NET 5.0 との互換性を調べる
  2. プロジェクトファイルの差し替え
  3. アプリケーションの設定
  4. 参照の追加
  5. App.configファイルの修正

の手順で行います。

.NET Frameworkから .NET 5.0 へ変換するための互換性を調べる

.NET Frameworkから .NET 5.0 への互換性を調べるには、 .NET Portability Analyzer というツールを使います。

このツールを使うには、Visual Studio のメニューの 拡張機能 → 拡張機能の管理 をクリックします。

表示されたウィンドウの オンライン を選択し、右上の検索ボックスに .NET Portability と入力すると
.NET Portability Analyzer がみつかるので、これをダウンロードしインストール(Modifyボタンをクリック)します。

インストールが完了すると、Visual Studioのメニューの 分析 に追加されますが、まずは、ツールの設定を行うため、 Portability Analyzer Setting をクリックします。

今回は、 .NET 5.0への互換性を調べるため、 .NET の 5.0 にチェックを入れます。
また、Output formatsは、好みもあると思いますが、 HTML が見やすいので、これにチェックを入れます。

上図のようにチェックを入れたら、OKボタンをクリックし、メニューの Analyze Assembly Portability をクリックします。

すると、プロジェクトが出力する実行ファイル(*.exe)〔ライブラリの時はdllファイル〕を聞かれるので、exeファイル もしくは dllファイルを選択し、開く をクリックします。

すると、作成された互換性解析結果のファイルが表示されるので、 Open Report をクリックします。

解析結果は以下のように表示されます。

これを見ると、 .NET 5.0 への互換性は100%
100%でない場合は、まだ見た事がないのですが、互換性が無いと、 Recommend changes に何か表示されるのかな??

これで、 .NET 5.0 への互換性は100%あると確認できたので、移植作業を行います。

※移植作業のため、.NET Frameworkのプロジェクト一式すべて、.NET 5.0用にファイルをコピーします。
(旧.NET Frameworkのプロジェクトも構成を調べるのに使うので、とっておいてください)

プロジェクトファイル(*.csproj)の差し替え

コピーしたプロジェクトを Visual Studio で開き、プロジェクトファイル(*.csproj)を編集するのですが、そのままでは編集できないので、ソリューションエクスプローラのプロジェクト名を右クリックし、プロジェクトのアンロードを行います。

プロジェクトのアンロードを行うと、プロジェクトファイルの中身が表示されます。

.NET Frameworkのプロジェクトファイルの中身は、上図のように、いろいろと記載されているのですが、.NET 5.0 では、とりあえず以下の内容に差し替えます。

<Project Sdk="Microsoft.NET.Sdk">
 <PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>net5.0-windows</TargetFramework>
  <UseWindowsForms>true</UseWindowsForms>
  <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
 </PropertyGroup>
</Project>

ただし、プロジェクトの出力ファイルが実行ファイル(*.exe)ではなく、ライブラリ(*.dll)の場合は

<OutputType>WinExe</OutputType>

の行は削除します。

差し替え後のプロジェクトファイルは下図のように、不安になるぐらいスッキリとしていますが、不足している物もあるので、次項で修正していきます。

プロジェクトファイルの中身を差し替えたら、アンロードしたプロジェクト名を右クリックし、プロジェクトの再読み込みを行います。

アプリケーションの設定

プロジェクト名を右クリックし、プロパティで表示されるアプリケーションの設定は、プロジェクトファイルを差し替えた事で、.NET Frameworkで行っていた設定が消えている可能性があるため、必要に応じて設定してください。

出力されたファイル(*.exe、*.dll)のプロパティで表示される会社名やバージョンなどは、.NET Frameworkの時は、アプリケーションの設定のページに アセンブリ情報 というボタンがありましたが、 .NET 5.0 では、パッケージという項目へ移動したので、この内容も間違いないか?確認してください。

 

参照の追加

.NET Frameworkのプロジェクトの 参照 に追加していたプロジェクトやライブライへの参照を追加します。

.NET 5.0 でのプロジェクトでは、 参照 から 依存関係 に表示が変更されていますが、この 依存関係 を右クリックし、プロジェクト参照の追加 をクリックします。

ここで、従来の参照と同じ様に、プロジェクトやライブラリの参照を追加します。

依存関係の参照にライブラリやプロジェクトを追加すると以下のように、.NET Frameworkの時の参照からは少し変更された表示になっています。

 

App.configファイルの修正

プロジェクトに App.config ファイルがある場合は、このファイルを修正します。

ソリューションエクスプローラの App.config ファイルを選択し、<supportedRuntime>の部分(下図の青く選択された部分)を削除します。

 

動作確認

ここまで修正を行い、ソリューションのビルドを行うと、フォームのアイコンが変更され、.NET 5.0 に移植出来た事が確認できます。

 

その他

.NET Frameworkから.NET5へ移植すると、SplitContainerの表示が少し崩れていました。
また、.NET Frameworkでは、SplitContainerのSplitterの位置は、フォームエディタの表示で、マウスのドラッグで移動する事ができましたが、.NET5では、それが出来なくなっていたので、SplitterDistanceプロパティで調整してみたりと、他にも少しずつ、.NET Frameworkとは異なる点があるとは思います。

他にも、.NET Frameworkのソリューションで、

・Windows Formsのプロジェクト
・クラスライブラリのプロジェクト
・ユーザーコントロールのプロジェクト

を作り、Windows Formsのプロジェクトから、クラスライブラリ、ユーザーコントロールのプロジェクトを参照し、Windows Formsのプロジェクトだけを.NET 5.0に変更し、他は.NET Frameworkのままにしてみたのですが、動作はするようでした。
つまりは、.NET 5.0 のプロジェクトから、.NET Frameworkのライブラリを使う事が出来たのですが、.NET と .NET Framework が混在出来るのは、今だけ?かもしれないので、どうせ.NET へ移植するのなら、すべてを移植するようにした方が良いでしょうね?

参考ページ

https://docs.microsoft.com/ja-jp/dotnet/core/porting/winforms

 

 .NET 5 C# Windows Forms プログラミング へ戻る