もう迷わない。NuGet を .NET 5 へ移行する方法を徹底解説

「.NET アプリケーションと NuGet ライブラリの .NET Core “vNext” (.NET 5 以降) への移行は複雑すぎてよくわからない」と思いませんか?この記事では、来る .NET 5 時代に備えて、その移行方法と対策をわかりやすく解説します。

実際のやり方はアプリケーションによって異なるので、この記事を参考にして自分のアプリケーションをどうすべきか今から検討してみましょう。

.NET アプリケーションと NuGet ライブラリの .NETCore“ vNext” (.NET 5 以降) への移行は複雑怪奇です。数多のアプリケーションと数え切れないほどのライブラリ……。考えるだけで頭が痛くなってきますね。また、それらはすべて、すでに化石となったものからまだ計画中のものまで、サポート期間などを調べ出すときりがありません。また、ライブラリを移行するまでは既存のアプリケーションの移行もできません。

そして、以下のような問題もあります。

  • .NET 5 以降のアプリケーションは .NET Framework ライブラリが使用できない
  • .NET Framework アプリケーションは .NET 5 以降のライブラリを使用できない

……もっと頭が痛くなってきましたね。でもご安心下さい。ライブラリを新しい .NET プラットフォームにターゲットするには、次の 5 つの方法から選ぶだけです。

  1. Abandon (放棄)
  2. Update (アップデート)
  3. Fork (フォーク)
  4. Multi-Target (マルチターゲット)
  5. Bridge (ブリッジ)

以下では、各選択肢の詳細、どういった時にその方法を選ぶべきか、それを実行する方法について解説します。ここでは最も単純な方法から説明していきますが、アプリケーション、ライブラリ、および移行の計画を考慮し、最も適切な方法が何かをよく考えるようにしてください。

選択肢1: Abandon (放棄)

もしライブラリを .NET 5 以降に移行する予定がない場合、.NET Framework ライブラリは永久に残ります、その場合、アップデートはマイナーなものがたまにあるくらいです。

やること放棄(Abandon)
使用場面廃止された技術を用いたライブラリを使用する場合
利点何もしなくて済む
欠点これを使用したライブラリは .NET5 以降では使用できなくなる。また、オペレーティングシステム (OS) のサポート終了後も、サポートされている OS では使用できなくなる
やり方最小限かつ必要な場合にのみライブラリの保守を行う

放棄を選ぶ場合

「Abandon」は、廃止されている技術または .NET 5 以降のフレームワークではない技術 (Webフォーム、WCF、およびWF) を多用するライブラリに適しています。一般的に組織では、レガシーな技術を使用したアプリケーションやライブラリが多く使用されていますが、その中にはこれからも使用する一方で書き直す必要がないものもあります。この良い例としては、LINK Web フォームアプリケーションが挙げられます。

例: WCF ベースのアプリケーションでのみ使用する Kramerica.WCF.Utils というライブラリです。WCF は .NET5 以降にはないため、このライブラリを移行しても意味がありません。したがって、Kramerica.WCF.Utils の保守は、最小限かつ必要な場合にのみ行うようにしてください。

選択肢 2: Update (アップデート)

「Update」は、.NET Framework を .NET 5 以降に移行しながらも、緊急時に備えて古いバージョンに戻せる方法です。

やることアップデート(Update)
使用場面ほとんどのアプリケーションは .NET5 以降を使用する一方で、.NET Framework を使用する一部の古いアプリケーションもそのまま残す場合
利点緊急時に「事後フォーク」できる (つまり、古いバージョンにロールバックできる)
欠点新しいライブラリがリリースされるまで、元のライブラリを維持する必要がある
やり方.NET Framework ライブラリの最後のバージョン番号と最初の .NET5 以降のバージョン番号に幅を持たせる

アップデートを選ぶ場合

すべてのアプリケーションを短時間で移行したい場合です。このやり方で古いライブラリを更新して、一度に新しいライブラリに移行できます。また、ごく少数のアプリケーションでのみ使用されるライブラリにも適しています。

移行方法

ライブラリはバージョン管理されています。ターゲットを変更したり、コード内のエラーを修正したりして、新しいバージョンのライブラリを公開する際は、メジャーなバージョン番号を使用してください。その番号は、元の番号より幅を持たせた大きな数字にする必要があります (たとえば、Kramerica.Utils 2.6 から Kramerica.Utils 5.0 への変更)。
大きなバージョンアップを行うと、ライブラリ間に大きな違いがあることをユーザーに伝えられます。また、古いバージョンと新しいバージョンの番号に幅を持たせることで、ロールバックに余裕ができます。それにより、緊急時には、まず過去のバージョンに戻して、古いライブラリからから新しいバージョンを作成できます。基本的に「過去にさかのぼって」古いライブラリの新しいバージョンを作成できます。つまり、事後的なフォークが可能ということです。

例:Kramerica.MVC.Utils は MVC を使用しており、これは .NET 5 以降に移行可能です。そのため、移行時、このライブラリの更新には最小限の変更で済みます。移行する際は、古いバージョンのライブラリを Kramerica.MVC.Utils 3.1 にバージョン管理し、新しいバージョンのライブラリを Kramerica.MVC.Utils5.0 にバージョン管理します。

選択肢 3: Fork (フォーク)

「Fork」は、Word の文書で「ファイル>名前を付けて保存」するのと同じです。つまり、同じソースコードを別のリポジトリにコピーします。コピー後、ライブラリに移行して新しい .NET プラットフォームをターゲットにすることで、古いライブラリを変更したり削除したりすることなく、まったく新しいライブラリを作成できます。

やることフォーク(Fork)
使用場面.NET  Framework を使用したアプリケーションと .NET 5 以降を使用したアプリケーションを中長期で共存させたい場合
利点新しいライブラリと古いライブラリを同時に使用しながら、互いに独立した状態で共存させることが可能
欠点複数の似たようなコードを保守、リリースする手間がある他、それらのコード内容を同じにする必要がある
やり方ライブラリのコピー、ターゲットの変更、コードのエラーの修正を行った後、新しい名前で公開する

どういったときにこの選択肢を選ぶべき?

「Fork」は、中長期的にライブラリの .NET Framework バージョンが必要になる場合に便利です。移行が複雑になる場合 (ライブラリ内の .NET Framework の一部が .NET5 以降に存在しない場合など) も、この方法が有効でしょう。
具体的には、コードの 80-90% が同じで残りの 10-20% が異なる場合に適しています。しかし、コード内容が互いに大きく違う場合や移行自体が簡単な場合は、他の方法を選んだ方が良いでしょう。

移行方法

下記の通り比較的簡単な手順で行えます。

  1. 現在のライブラリをフォークします。
    • ソースコードをコピーし、「Utils」から「UtilsCore」といったようにプロジェクト/リポジトリの名前を同様に変更します。
  2. フォークしたライブラリで、Visual Studio がターゲットする対象を変更します。
    • この手順直後でコンパイルしようとすると、ほぼ確実にエラーが発生するので注意してください。
  3. ターゲットの変更とテストにより発生したエラーを修正します。
    • エラーがなくなるまで、この手順を繰り返します。
  4. ライブラリを新しい名前で公開します。

例:Kramerica.Network.Utils は、Kramerica.NetworkCore.Utils を作成するためにフォークされています。

選択肢 4: Multi-target (マルチターゲット)

ライブラリの両方のバージョン (.NET Framework バージョンと .NET5 以降のバージョン) を含む単一の NuGet パッケージライブラリを作成します。これは Visual Studio がターゲットとする .NET プラットフォームを決定することから、非常に効率的な方法となります。

やることマルチターゲット(Multi-target)
使用場面異なる .NET プラットフォームで複数のアプリケーションを効率的にサポートし、ライブラリを同期し続けたい場合
利点1つのライブラリを .NETFramework と .NET5 以降の両方で使用可能
欠点コードの記述と保守が複雑
やり方2 つ以上のライブラリを含む 1 つの NuGet パッケージを作成する

マルチターゲットが何かを理解するには、映画で例えるのがわかりやすいでしょう。たとえば、スターウォーズ三部作が見たくなったので、DVD と Blu-ray ディスクのセットを購入したとします。このセットには、全く同じ内容の映画が DVD と Blu-ray ディスクの両方に入っているので、自宅にあるどのプレーヤーでも再生できます。NuGet パッケージのマルチターゲットでは、これと同じことを行っています (ただし、ほとんどの Blu-ray プレーヤーでは DVDを再生できる一方、.NET 5 以降ではフレームワークライブラリが必ずしも使用できるようになるとは限りません)。

どういったときにこの選択肢を選ぶべき?

.NET Framework で使用するライブラリの機能と .NET5 以降で使用するライブラリの機能が多少違ったとしても、全体としては両方がかなり似ている場合です (Blu-ray 版は DVD よりも高画質ですが、映画の内容自体は一緒であるのと同じような感じです)。つまり、コードベースがほとんど同じである場合にこの方法が最適です。
新しいアプリケーションを作成するときは、Visual Studio に対してターゲットとする .NET プラットフォームを指定しますが、この方法でマルチターゲットの NuGet ライブラリを作成すると、Visual Studio がコンパイルするたびにさまざまな選択肢から適切なライブラリを選択できるようになるため、時間を節約できます。
ただし、マルチターゲティングに関する情報はネット上にあふれており玉石混交なので、どの情報を参考にするかは精査する必要があります。

移行方法

C# コードをコンパイルするときに、.NET Framework や .NET 5 以降など、必要なアセンブリの種類を選択します。NuGet パッケージ (zip ファイル) には、アセンブリの種類にちなんで名付けられたサブフォルダの中にライブラリがあります。それにより、NuGet パッケージが .NET Framework ライブラリ (バージョン 4.5.2 を表した .net452 という名前のフォルダ内) または .NET 5 以降のライブラリ (net5.0 という名前のフォルダ内) の両方を持てるようになります。

一般的に、これを機能させるには次の 2 つを行う必要があります。

  1. 複数回コンパイル/ビルドするようにプロジェクトを構成します。この際、ターゲットにするプラットフォームごとに1回ずつ行います (たとえば、.NET Framework 4.5.2 および .NET 5.0)。
  2. これらすべてのアセンブリから NuGet パッケージをビルドします。

詳細な手順については、Windows での使用または Visual Studio の Mac での使用に関するドキュメントを参照してください。

例:Kramerica.Data.Models は、単一の Framework 4.8 互換ライブラリのみを含む NuGet パッケージから、複数のライブラリ、Kramerica.Data.FrameworkModels およびKramerica.Data.CoreModelsを 含むパッケージに変わります。

選択肢 5: Bridge (ブリッジ)

.NET Standard 2.0 と呼ばれる廃止される可能性がある技術とライブラリのコードに互換性がある場合は、上記のようなマルチターゲティングを行う際の面倒な作業を行わずに .NET Framework と .NET5 以降の両方で機能するライブラリを作成できる場合があります。

やることブリッジ(Bridge)
使用場面他の方法を行うまでの時間を稼ぎたい場合 (コードがサポートしている場合のみ有効)
利点1 つのライブラリを .NET Framework と .NET5 以降の両方で使用可能
欠点.NET Framework の機能しかない廃止された技術をライブラリが使用することになる
やり方ライブラリのターゲットを .NETStandard2.0 に変更する

.NET Standard は .NET Core の前身であり、Microsoft が .NET 5 以降より前のすべての .NET プラットフォームを統合しようとしてできたものです。つまり、ライブラリがすでに .NET Framework 4.7.2 以降をターゲットにしている場合、この方法が最適でしょう。

先ほどのスターウォーズの DVD と Blu-ray の例えで言うと、「.NET Standard 2.0 をターゲットにする」というのは、DVD と Blu-ray ディスクを一緒にしたディスク (ここでは仮に BlueDVD とします) をリリースするようなものです。つまり、たいていの DVD および Blue-ray プレーヤーで再生できる、DVD でもあり Blu-ray でもある単一のディスクを作成するということです。

どういったときにこの選択肢を選ぶべき?

アプリケーションを .NET 5 以降に移行するまで時間を稼ぎたい場合に使用します。この方法はマルチターゲティングよりシンプルですが、一時的にしか使用できません。というのは、ライブラリが現在 .NET Framework 4.7.2 以降をターゲットにしている場合にのみ機能するからです。そして最終的には、ここで説明している他の4つの選択肢を選ぶ必要があります。

この方法は、(マルチターゲットのように) 全体的にかなり似ている 2 つのライブラリを含む単一の NuGet パッケージを使用するのではなく、.NET Framework 4.7.2 でのみ使用可能な単一のライブラリが生成されます。そして、ライブラリの内容によっては、これで問題ない場合もあります。

マルチターゲットでは、.NET 5 以降を使用した新しいアプリケーションのコードに追加機能を導入できます。したがって、次第に使用するすべてのアプリケーションを .NET 5 以降に移行していき、ライブラリから .NET Framework のターゲティングを削除することで単純なパッケージに戻せます。このやり方は、.NET 標準の「bridge」では不可能でした。

移行方法

これを行う手順は基本的に「Update」と同じです。しかし、エラーが発生する可能性が高いため、別の方法を取った方が良い場合もあります。

  1. ライブラリで、Visual Studio が .NET Standard 2.0 をターゲットするように変更します。
  2. Visual Studio がから出力されるエラーと互換性の有無を確認します。
    大幅なコード変更が必要になるエラーを探します
  3. 次に、どちらかを行います。
    • エラーを修正してテストし (必要に応じてこの作業を繰り返す)、新しいターゲティングでライブラリを公開します
    • 別の移行方法を選択します

よくある質問と関連情報

マルチターゲティングについて調べていると、混乱してよくわからなってしまうことがあります。下記では、よくある質問とその回答を参照情報と一緒にご紹介します。

Q. 色々なプラットフォームのライブラリを管理できる以外に、マルチターゲティングを行う利点は何ですか?

A. アプリケーションを .NET5 以降と .NET Framework の両方のフレームワークでビルドし、これらのバージョンを並べてテストできます。これにより、新しいバージョンのプラットフォームを本番環境にデプロイして問題が発生した場合は、ただちに .NET Framework アプリケーションに切り替えられます。つまり、保険のようなものです。
ちなみに、マルチターゲティングは、アプリケーションを移行するための考え方でもあります。そして、Inedo ではこれを ProGet で行っています

Q. マルチターゲティングは、実際の開発ではどのように使用されていますか?

A. あるライブラリから別のライブラリに移植する方法については、Rick Strahl 氏の「.NET ライブラリの .NET Core 2.0 へのマルチターゲティングと移植」をご覧ください。マルチターゲットアプリケーションについては、Brad Robinson 氏の「.NET でマルチターゲティングを行う難しさ」をご覧ください。

Q. SDK プロジェクトでターゲットするにはどうすればよいですか?

Microsoft から SDK スタイルのプロジェクトに関する詳細なドキュメントが提供されていますので、ご参考ください。

Q. .NET Framework を使用して複数のプラットフォーム向けに開発するにはどうすればよいですか?

Microsoft から提供されているドキュメントにやり方が載っています。実際のところ、それほど難しい作業ではありませんが、リンク先をよく読んで頭の中で噛み砕いてから行いましょう。

Q. 単一の NuGet パッケージで複数のオペレーティングシステムをターゲットにできますか?

.NET 5 以降は、クロスプラットフォーム開発が正式に可能となります。.NET Standard に関するこの記事は少し古くなっているものの、いくつかまだ役に立つ情報がありますので、ご参考ください。また、Microsoft から提供されているドキュメントの「When to Choose .NET 5 (.NET 5 を選択するタイミング)」という節でも、そのことが詳しく説明されています。

Q. この記事の内容は .NET Multi-Targeting Pack と関係がありますか?

技術的な回答が知りたい方は、「.NET Multi-Targeting Pack とは何か」と「使用上のガイドライン」をご確認ください。しかし、この記事で説明した方法が .NET Multi-Targeting Pack に何か影響を及ぼすわけではないので、ご安心ください。

Q. この記事の内容は .NET Multi-platform App UI (MAUI) と関係がありますか?

特にありません。しかし、MAUI に興味がある方は Microsoft の MAUI をご覧ください。