【.NET】C#でSIMDを使った高速演算

私は、.NET Frameworkを使う事が多いのですが、.NET FrameworkからSIMDを使うにはSystem.Numerics.Vectorsクラスを使ってSIMD演算ができるのですが、C言語で使うSIMDとは全く別物で使っていませんでした。

ところが、.NET Core 3.0から使えるSystem.Runtime.Intrinsics.X86 名前空間は、ほぼC言語のSIMDと似ているので、.NET 5.0 も登場した事だし、少し触ってみました。

 

そもそもSIMDって何?という話は私も説明できる程は理解していませんが、8bitの型(byteなど)や16bitの型(shortなど)を128bitや256bitでまとめて演算する事で、高速に処理する事が可能となります。

まずは、C言語の説明になりますが、ここ↓を見る事をおススメします。

 

C#のSIMDで出来る事は、加算、減算、シフトやビットの入れ替えなどになりますが、ここ↓を参照下さい。

https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.intrinsics.x86.avx2?view=net-5.0

 

ushort型配列をビットシフトし、byte配列へ代入する例

ushort型(16bit)の配列に格納された10bitの値(0~1023)を2bitシフトして、8bit(byte型)の配列に代入する例を示します。

 

SIMDのプログラムでは、ポインタを使うので、プロジェクトのプロパティで、アンセーフコードの許可にチェックを入れます。

 

まずは、作成したコンソールアプリのサンプルをご覧ください。

using System;
using System.Runtime.Intrinsics.X86;

namespace ConsoleApp1
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            // データの個数(16の倍数の個数)
            int dataCount = 1024;

            // ushort型(16bit)の配列
            var usData = new ushort[dataCount];
            // byte型(bit)の配列
            var bData = new byte[dataCount];

            // 評価用データの作成
            for (int i = 0; i < dataCount; i++)
            {
                usData[i] = (ushort)i;
            }

            fixed (ushort* pusData = usData)
            fixed (byte* pbData = bData)
            {
                for (int i = 0; i < dataCount; i += 16)
                {
                    // データをポインタから読み込む
                    var vVal1 = Avx2.LoadVector128((short*)pusData + i);
                    var vVal2 = Avx2.LoadVector128((short*)pusData + i + 8);
                    // 2ビット右側へシフト
                    vVal1 = Avx2.ShiftRightLogical(vVal1, 2);
                    vVal2 = Avx2.ShiftRightLogical(vVal2, 2);
                    // パック
                    var vDst = Avx2.PackUnsignedSaturate(vVal1, vVal2);
                    // 結果をbyte型配列に書き込む
                    Avx2.Store(pbData + i, vDst);
                }
            }

            // 結果出力
            for (int i = 0; i < bData.Length; i++)
            {
                Console.Write($"{bData[i],3}, ");
            }
        }
    }
}

今回は、AVX2を使っていますが、AVX2は第4世代Core(Haswell)以降のCPUであれば使用可能なので、今どきのPCであれば、ほとんど使用できると思います。

 

まず、LoadVector128メソッドで、ushort配列(16bit)のポインタを128bitのVetorと呼ばれる高速に読み書きできる領域へ読込しています。
16bitのデータを128bitへ読込しているので、この1回のメソッドで、128 / 16 = 8 の8個分のデータを読込しています。
ちなみに、ushortポインタ(ushort*)をshortポインタ(short*)へキャストしているのは、最後に出てくるPackUnsignedSaturateへ渡す引数にVector128<ushort>が無い(Vector128<short>はある)ため、short*へキャストしています。

var vVal1 = Avx2.LoadVector128((short*)pusData + i);

ShiftRightLogicalメソッドでは、右側へシフトしています。
下記の例は2ビット右側へシフトしています。(4で割るのと同じ)

vVal1 = Avx.ShiftRightLogical(vVal1, 2);

PackUnsignedSaturateメソッドでは、パックと呼ばれる処理になりますが、詳細は最初に示した参考文献を見て頂くのがいいかと思いますが、引数で渡された型の半分の下位ビットをつなぎ合わせた物を返します。

var vDst = Avx2.PackUnsignedSaturate(vVal1, vVal2);

 

今回の例では、最初の引数の8個の16bitの値のそれぞれ、下位8bitの部分を取得し、8個の8bitの値とし、第二引数も同様に8個の8bitの値を取得し、計16個の8bitの値(16 x 8 = 128bit)を返します。

 

StoreメソッドはVectorから配列を示しているポインタへ値を戻します。

Avx2.Store(pbData + i, vDst);

まとめ

現状では、.NETのSIMDの情報が少ないので、C言語のSIMDの情報を頼りにする事になるかと思いますが、今回、Vectorと言っていた部分をレジスタに読み替えれば、ある程度理解できると思います。

また、このVectorへ渡すメモリにアライメントという概念があり、LoadVector128と似たメソッドにLoadAlignedVector128というメソッドがあり、これを使うと処理が少し速くなるのですが、メモリのアドレス(番地)が128で割り切れる必要があり、通常、配列から取得したポインタのアドレスは、このアドレスが128では割り切れない番地になっているため、少し工夫しないと、そのままでは使用する事ができません。

 

 

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

 

【.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 プログラミング へ戻る

【.NET 5 C# WinForms】バージョン情報の設定

プログラムのバージョン情報を指定するのには、.NET Frameworkの時は、プロジェクトのプロパティをクリックし、

表示された画面の アプリケーションアセンブリ情報 をクリックすると

 

アセンブリ情報のウィンドウが表示され、バージョンを設定することができました。

 

しかしながら、.NET 5 で作成したプロジェクト(Windows Forms(.NET Core))ではプロジェクトのプロパティのアプリケーションの画面にアセンブリ情報のボタンがありません。

 

.NET 5 で作成したプロジェクト(Windows Forms(.NET Core))では、プロジェクトのプロパティで表示された画面に パッケージ が追加されているので、このパッケージを選択し、画面の下の方にアセンブリバージョンアセンブリファイルのバージョンがあるので、この値を編集します。

 

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

【.NET 5 C# WinForms】メニューとメニューイベントの追加

(2021.8.3追記)Visual Studio 2019を更新することにより下図のように従来の.NET Frameworkと同等にメニューを追加できるようになりました。本記事は旧バージョン操作方法となります。
下図は Visual Studio Community 2019 バージョン 16.10.4 の画面です。

 


 

.NET5のメニューは、.NET Frameworkのメニューと比べ、メニューの追加方法とイベントの追加方法が変更されています。

今回は、このよう↓にメニューを追加します。

 

メニューの追加

ツールボックスの MenuStrip をフォームへドラッグ&ドロップします。

 

すると、フォームに MenuStrip が追加されますが、.NET Framework のときのように、 ここへ入力 の文字が表示されていません。

(参考).NET FrameworkのMenuStrip

 

.NET 5において、メニューを追加するには、MenuStripプロパティ画面の ItemsCollection を追加するため、右側にある ボタンをクリックします。

 

すると、このようなエディタが表示されます。

 

次に、Addボタンをクリックし、MenuItemを追加します。

.NET5でも、.NET Frameworkと同じように MenuStrip にMenuItem,ComboBox,TextBoxが追加可能です。

 

MenuItemを追加すると、このようになります。

 

さらに後から分かりやすいように、 (Name)の名前を変更し、メニューの表示名(今回は ファイル(&F))を変更しておきます。

 

同様にして ヘルプ 用のメニューも追加した状態がこちら↓

 

さらにメニューの ファイルの下に 開く終了 を追加したいので、今度は DropDownItems の(Collection) の右側にある ボタンをクリックし、 開く終了 を、ファイルの時と同様に追加します。

 

メニューイベントの追加

次に、メニューのクリックイベントを追加したいのですが、.NET Frameworkの時にあった⚡マークがありません。

そこで、プロパティウィンドウの上部にある ▼マーク をクリックしすると、フォームに追加されているコントロール一覧が表示されるので、この中からメニューのイベントを追加したい項目(ここでは menuFileExit)を選択します。

 

すると、 menuFileExitのプロパティが表示され、⚡マークも表示されるので、⚡をクリックし、さらにメニューのクリックイベント(Click)をダブルクリックします。

 

すると、.NET Frameworkと同様に、Clickイベントのコードが生成されるので、イベント内の処理を追記していきます。

 

今回は 終了 のメニューイベントだったので、 this.Close() を追記しました。

 

このようにして、最初に示したようなメニューが追加できます。

 

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

【.NET 5 C# WinForms】新規プロジェクトの作成

.NET5 の Windows Forms のプロジェクトの作成はVisual Studio を起動し、新しいプロジェクトの作成をクリックします。
※.NET 5.0を使用するには Visual Studio 2019 Ver.16.8以降が必要になります。

 

表示されたプロジェクトの種類の中から、 Windows Forms App(.NET) を選択し、次へをクリックします。

 

Windows Forms App(.NET)とは別に Windows フォームアプリケーション(.NET Framework)もあるので、ご注意下さい。(こちらのプロジェクトでは.NET 5 は指定できません。)

また、プロジェクトの種類が多いので、探すのが大変な場合は、上の方にあるプルダウンから C#,Windows ,デスクトップ を選択すると、少し見つけやすくなります。

 

これで、最小限のプロジェクトが作成されますが、C#のソースコードを見ると、従来の.NET Frameworkのソースコードと違いはありません。

ちょっと違うのが、フォームのアイコンぐらいでしょうか??

 

プロジェクトのプロパティで、対象のフレームワーク を確認し、.NET 5.0 を使用する場合は、対象のフレームワークを .NET 5.0 へ変更してください。

 

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

この場合、プロジェクトの設定を変更するのですが、変更方法については、下記ページを参照下さい。

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

 

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

.NET5とVisual Studio2019のダウンロード、インストール

2020.11.10(日本時間で11日の1:00)に.NET 5.0 が公開されました。
.NET 5.0 を使用するためには、Visual Studio 2019のVer.16.8以降が必要になるので、それぞれのダウンロードとインストール方法をまとめました。

.NET 5.0 のダウンロード、インストール

.NET 5.0 はマルチプラットフォーム対応なので、LinuxやmacOSにも対応しているのですが、ここではWindows(64bit)を想定しているので、こちら↓のページから、Windowsのx64をダウンロードします。

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

インストールそのものは、ダウンロードしたファイル(dotnet-sdk-5.0.100-win-x64.exe)をダブルクリックすれば、インストールできると思います。

 

(2021.11.15追記)

現在は、.NET6が公開されています。
.NET6のダウンロード先はこちら↓

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

Visual Studio のダウンロード、インストール

.NET 5.0対応のVisual Studio は Visual Studio 2019 Ver.16.8以降になりますが、こちらから入手できます。

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

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

私は個人用途なので、Community版をダウンロードしました。

インストールはダウンロードしたファイル(vs_community__179898993.1589457630.exe)をダブルクリックすると、始まります。

インストールはここ最近のこの画面↓です。

後からも変更できますが、私は

  • .NETデスクトップ開発
  • C++によるデスクトップ開発
  • ユニバーサルWindowsプラットフォーム開発
  • .NET Core クロスプラットフォーム開発

の4つをインストールしました。

 

正式版版のリリースノートについては、こちら↓で確認できます。

https://docs.microsoft.com/ja-jp/visualstudio/releases/2019/release-notes

 

インストールが完了したら、.NET 5.0 の C#のWindows Formsの新規プロジェクトの作成方法をこちら↓にまとめておきましたので、合わせてご参照下さい。

【.NET 5 C# WinForms】新規プロジェクトの作成

 

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