.NET Core 3.1 から .NET 8 へのアップグレード

.NET Core 3.1 から .NET 8 へのアップグレード

.NET Core 3.1 は長い間使用されてきましたが、実際には2022年末にマイクロソフトのサポートが終了しました。後続のLTSバージョンである.NET 6も2024年11月にサポート終了となるため、.NET 8に直接アップグレードするのが最良の選択です。

最終更新 2023/12/08 5:27
不止dotNET
読了目安 3 分
カテゴリ
.NET
タグ
.NET C# 技術アップデート

.NET Core 3.1 は長い間使用されてきましたが、実際には2022年末にMicrosoftのサポートが終了しており、次のLTSバージョンである.NET 6も2024年11月にサポートが終了するため、直接.NET 8にアップグレードするのが最善の選択です。

Microsoft公式のアップグレードツール Upgrade Assistant が提供されています。

アップグレードツールを使えば、アップグレードは非常に簡単になります。この記事では、アップグレードツールを使用して.NET Core 3.1プロジェクトを.NET 8にアップグレードする方法を紹介します。

Upgrade Assistant のインストール

まず、VS2022が17.8にアップデートされていることを確認してください。次に、VS2022の拡張機能管理で「.NET Upgrade Assistant」拡張機能をインストールします。特に注意したいのは、以前にアップグレードツールの拡張機能をインストールしたことがある場合は、アンインストールしてから再インストールする必要があることです。

画像

プロジェクトのアップグレード

.NET Core 3.1のソリューションには多くのプロジェクトが含まれている場合があります。プロジェクトの依存関係に従って、最下層のプロジェクトから順にアップグレードしていきます。

  1. アップグレードツールをインストールした後、プロジェクトを右クリックすると「Upgrade」ボタンが表示されます:

画像

  1. ポップアップでアップグレード方法を選択します:

画像

  1. アップグレード対象のバージョンを選択します。ここでは.NET 8を選択します。これは長期サポート(LTS)バージョンです。最新のアップグレードツールは7と8へのアップグレードのみサポートしています。.NET 6へのアップグレードが必要な場合は、古いバージョンを使用する必要があります:

画像

  1. 更新する内容を選択します。デフォルトで全て選択されています。「Upgrade selection」をクリックしてアップグレードを実行します:

画像

  1. すぐにアップグレード成功のメッセージが表示されます:

画像

コンパイル

私はいくつかの旧バージョンのプロジェクトで検証しましたが、ツールを使用したアップグレードプロセスではエラーは発生しませんでした。しかし、アップグレード後にコードをコンパイルすると、様々な問題が発生します。

問題1:Ionic.zip

元のバージョンでは、プロジェクト内のzip圧縮にIonic.zipを使用していましたが、.NET 8ではサポートされなくなったため、DotNetZipに置き換える必要があります:

画像

問題2:BinaryFormatter の非推奨

コード内の多くの箇所でバイナリシリアル化を使用していますが、BinaryFormatterは.NET 8では非推奨(非推奨)となっています。以下の2つの解決方法があります:

  1. ソースコードを修正し、新しい推奨方法に置き換える。
  2. プロジェクトファイルを修正してこの問題を無視する。プロジェクトファイルに以下の設定を追加します:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0011</NoWarn>
  </PropertyGroup>
</Project>

参考:https://learn.microsoft.com/zh-cn/dotnet/fundamentals/syslib-diagnostics/syslib0011

問題3:Aspose の使用に関する問題

プロジェクト内でOfficeファイルの処理にAsposeスイートを使用していました。アップグレード後、バージョンの互換性問題が発生したため、対応するバージョンにアップグレードすれば問題ありません。

画像

問題4:メソッドのあいまいさ

以前のバージョンでは、Listに複合型が格納されている場合、型内の特定のフィールドで重複を排除する方法が直接提供されていませんでした:

List<UserInfo> list = new List<UserInfo>();
list.Add(new UserInfo() { Name="oec2003",Age=18});
list.Add(new UserInfo() { Name = "oec2003" ,Age=18});
list.Add(new UserInfo() { Name = "oec2004" ,Age=18});
list.Add(new UserInfo() { Name = "oec2004" ,Age=18});

var distnctList = list.DistinctBy(x=>x.Age);

foreach (var item in distnctList)
{
    Console.WriteLine(item.Name);
}

public class UserInfo
{
    public string Name { get; set; }
    public int Age { get; set; }
}

上記のコードのDistinctByメソッドは.NET Core 3.1には存在しなかったため、独自のDistinctBy拡張メソッドを用意していました。しかし、.NET 8ではデフォルトで提供されているため、メソッドの競合が発生します。独自の拡張メソッドを削除し、デフォルトのものを使用すれば解決します。

画像

実行

上記のコンパイル問題を解決すると、プログラムは正常に起動・実行できるようになります。全体のプロセスは非常に高速です。言うまでもなく、Microsoftの技術は下位互換性に優れており、ツールのサポートも加わり、新しいバージョンへのアップグレードに負担やプレッシャーを感じることはありません。

それに比べて、他の技術の中には絶えずアップデートやイテレーションを繰り返しているものの、主流として使用されているのは特定のバージョンにとどまっているものもあります。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む
同じカテゴリ / 同じタグ 2026/02/07

AOTの使用経験のまとめ

プロジェクト作成当初から、新機能を追加したり新しい構文を使用したりした場合には、すぐにAOT公開テストを実施するという良い習慣を身につけるべきです。

続きを読む