try-convertというツールを利用して、以下の手順でコンバートする(Visual Studio 2022で作成した.NET Frramework4.8のWindowsフォームの前提)。
コンバート手順
※実行する前に全ファイルを別フォルダなどにコピーしてバックアップしておくこと!
コンバートは自動でバックアップしてくれず、そのままプロジェクトが書き換えられるので注意!
-
- Windowsのスタートメニューから、Visual Studio2022(のフォルダの方)→x64 Native Tools Command Prompt for VS 2022をダブルクリックして起動
- 「dotnet tool install -g try-convert」を実行し、try-convertをインストールする。
既にインストール済みの場合、「dotnet tool update -g try-convert」を実行し、try-convertを最新版にアップデートする(この記事を作成した際に利用したバージョンは、0.9.232202) - 「cd c:\~(.slnファイルが保存されているパス)」で、.slnファイルが保存されているパスまで移動
- 「try-convert」を実行する
- しばらく待ち、「Conversion complete!」と表示されればコンバート完了!
- .slnファイルをダブルクリックし、Visual Studioを起動する
- ビルドを試すと、次のエラーが表示される。
「エラー NETSDK1136 Windows フォームまたは WPF を使用しているとき、またはそのようなプロジェクトまたはパッケージを参照しているときには、ターゲット プラットフォームを Windows に設定する必要があります (通常は TargetFramework プロパティに ‘-windows’ を含めることによる)。」 - ソリューションエクスプローラーからプロジェクト名を右クリックし、プロパティをクリック。表示された画面の「アプリケーション」のターゲットOSが「(なし)」になっているので「Windows」を指定する。
ターゲットフレームワークが「.NET 7.0」になっているので「.NET 6.0」を指定し、再度ビルドする。
これで、とりあえず.NET6としてコンバートが完了した。
以下の旧プロジェクトファイルが残るので、これらは削除してOK
「XXX.csproj.old(C#の場合)」「XXX.vbproj.old(VB.NETの場合)」
以下に、コンバート後に手修正した問題点を随時追記していく。
警告つぶし
「警告 CA1416 この呼び出しサイトはすべてのプラットフォームで到達可能です。’Font’ は ‘windows’ でのみサポートされています。」というような「CA1416」の警告が出た場合は、とりあえず以下のように警告をつぶすことができる。
C#
#pragma warning disable CA1416 LabelText.Font = new System.Drawing.Font("Meiryo UI", 21.75F); #pragma warning restore CA1416
VB.NET
#Disable Warning CA1416 LabelText.Font = New System.Drawing.Font("Meiryo UI", 21.75F) #Enable Warning CA1416
上記のように#から始まるディレクティブを使って、警告がでないようにする。
フォームのデザインがおかしくなる
フォーム自体のフォントが「Yu Gothic UI, 9pt」になるので、これを「MS UI Gothic, 9pt」に変更すれば元のデザインのままになった。
Process.Startが実行時エラーになってしまう
.NET Framework4.8のときは、以下を実行すると既定のブラウザで指定したURLのページが表示されていた
System.Diagnostics.Process.Start("https://juraku-software.net");
しかし、.NET6だとこれを実行すると「System.ComponentModel.Win32Exception: ‘An error occurred trying to start process ‘https://juraku-software.net’ with working directory ‘C:\~\bin\Debug\net6.0-windows’. 指定されたファイルが見つかりません。’」というエラーになってしまう。
そのため、.NET 6では以下のように修正する。
C#
var processStartInfo = new ProcessStartInfo { UseShellExecute = true, FileName = "https://juraku-software.net" }; System.Diagnostics.Process.Start(processStartInfo);
VB.NET
Dim processStartInfo As New ProcessStartInfo With { .UseShellExecute = True, .FileName = "https://juraku-software.net" } System.Diagnostics.Process.Start(processStartInfo)
こういう実行時エラーが一番怖い・・・挙動を変えないで欲しかった・・・