1. ホーム
  2. .net

[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?

2022-03-17 21:53:17

質問

Visual Studioでは、少なくとも3種類のクラスライブラリを作成することができます。

  • クラスライブラリ(.NET Framework)
  • クラスライブラリ(.NET標準)
  • クラスライブラリ(.NET Core)

前者は私たちが長年使ってきたものですが、私が抱えている大きな混乱ポイントは、.NET Standardと.NET Coreのクラスライブラリタイプをいつ使うか、ということです。最近、次のようなことを試みたときに、この問題に直面しました。 異なるフレームワークのバージョンをマルチターゲットにする ユニットテストプロジェクトの作成 .

では、次のような違いがあるのでしょうか。 クラスライブラリ(.NET標準) クラスライブラリ(.NET Core) なぜ両方が存在するのか、どのような場合にどちらかを使うべきなのか。

解決方法は?

<ブロッククオート

どのような場合に、どちらを使うべきでしょうか?

互換性とAPIアクセスのトレードオフで決定します。

ライブラリと互換性のあるアプリケーションの数を増やし、ライブラリがアクセスできる.NET APIの表面積が減少しても構わない場合は、.NET標準ライブラリを使用します。

ライブラリがアクセスできる.NET APIサーフェスエリアを拡大したい場合、また、ライブラリと互換性のある.NET Coreアプリケーションのみを許可しても構わない場合は、.NET Coreライブラリを使用します。

例えば、.NET Standard 1.3 をターゲットとしたライブラリの場合 との互換性があります。 .NET Framework 4.6、.NET Core 1.0、Universal Windows Platform 10.0 および .NET Standard 1.3 をサポートするその他のプラットフォームを対象とするアプリケーションをサポートします。ただし、このライブラリは、.NET APIの一部にアクセスすることはできません。たとえば Microsoft.NETCore.CoreCLR パッケージは、.NET Coreと互換性がありますが、.NET Standardとは互換性がありません。

<ブロッククオート

クラスライブラリ(.NET Standard)とクラスライブラリ(.NET Core)の違いは何ですか?

互換性があります。.NET Standardをターゲットとするライブラリは、.NET Coreや.NET Frameworkなどの.NET Standard準拠のランタイムで実行されます。 モノ / Xamarin . 一方、.NET Coreをターゲットとするライブラリは、.NET Coreランタイム上でのみ実行可能です。

API表面積: .NET標準ライブラリは、すべての機能が NETStandard.Library 一方、.NET Core ライブラリは、すべてのものが Microsoft.NETCore.App . 後者には約20の追加ライブラリが含まれており、そのうちのいくつかは.NET標準ライブラリに手動で追加することができます(たとえば System.Threading.Thread ) と、.NET Standardと互換性のないもの (例えば Microsoft.NETCore.CoreCLR ).

また、.NET Coreライブラリはランタイムを指定し、アプリケーションモデルも付属しています。これは、例えばユニットテストのクラスライブラリを実行可能にするために重要なことです。

<ブロッククオート

なぜ両方が存在するのでしょうか?

ライブラリを少し無視して、.NET Standardが存在する理由は移植性のためです。.NETプラットフォームが実装することに同意するAPIのセットを定義しています。.NET標準を実装しているプラットフォームは、その.NET標準をターゲットとするライブラリと互換性があります。これらの互換性のあるプラットフォームの1つが.NET Coreです。

ライブラリの話に戻ると、.NET Standardライブラリのテンプレートは、複数のランタイムで動作するように存在しています(APIの表面積を犠牲にして)。逆に、.NET Coreライブラリ・テンプレートは、(互換性を犠牲にして)より多くのAPI表面積にアクセスし、実行ファイルを構築するプラットフォームを指定するために存在します。

インタラクティブなマトリックスはこちら どの .NET 規格がどの .NET 実装をサポートし、どの程度の API 表面積が利用可能であるかを示しています。