.NET Standardと.NET Core


240

.NET Standardと.NET Coreの違いについて読みましたが、違いが何なのか、.NET Standardライブラリプロジェクトを選択するタイミングと.NET Coreライブラリプロジェクトを選択するタイミングは本当にわかりません。

.NET Standardは、使用するプラットフォームに関係なく、APIのセットが常に利用可能であることを確認するためのものです(そのプラットフォームが選択した.NET Standardバージョンと互換性がある限り)。私が間違っていない場合、これは、.NET Standardのクラスライブラリを作成し、選択した.NET Standardバージョンと互換性のある任意のプラットフォームで使用できることを意味します。

.NET Coreについては、クロスプラットフォームでの使用も対象としていることを読んだので、.NET Coreライブラリを選択すると、.NET Standardと同じように、多くのプラットフォームでも使用できるようです。

つまり、最後には違いがわかりません。どちらを使用すればよいですか?それらの違いは何ですか?


33
コードの用語で:.net標準=インターフェース、.netコア=クラス; クラスに対してコーディングする場合、メソッド(など)を取得することはできませんが、その具体的な型(および子孫)に制限されます。インターフェースを使用する場合、より小さな表面得られる可能性があります、任意の実装に対して機能します...それらの実装が期待されることを実行する限り:)はい、.netコアは複数のプラットフォームをターゲットにしますが、.netの他の実装があります標準
マークグラベル

9
.NETStandardはPCLの後継です。ポータブルクラスライブラリは、複数のプラットフォーム(電話、デスクトップ、ストア、ブラウザ、xboxなど)で実行できるライブラリの作成に役立ちました。nにひどく苦しんで、うまくスケーリングしませんでした!問題なので、彼らはそれを放棄しました。.NETCoreは、彼らが達成した最初のフレームワークにすぎません。最も簡単で、残りは追いつく必要があります。これは非常に進行中の作業であり、.NETStandard v2.0での大きな変更であることを覚えておいてください。今のところ、それらすべてを統治するための基準:)
Hans Passant

既存の質問に余分な質問を追加しないでください。編集におけるあなたの質問はこれとは別のものです。
ジョンスキート2017年

1
@JonSkeet次に、新しい質問を開く必要がありますか?アドバイスありがとうございます。なぜなら、私は最初に.net Coreマルチターゲットに関する新しい質問を開き、重複した質問であると彼らが反対したためです。
アルバロガルシア2017年

@ÁlvaroGarcía:はい、でも明確にしてください-現在の1文の質問は私にはまったくわかりません。
ジョンスキート2017年

回答:


195

私はあなたの疑問をさらに明確にし、ジョン・スキートの答えを拡張するように努めます。

.NET Standardは仕様です。そのため、特定の.NET Standardバージョン用にコンパイルされたライブラリは、さまざまな.NET Standard実装で使用できます。

私の他のコメントで言った、.NET Standardと他の.NETの標準実装(など.NETのコア、.NET Frameworkの、)との関係のために良いアナロジーはあるデビッド・ファウラーによって、この要旨:.NET標準のバージョンがあるInterfacesフレームワークがある一方で、それらのインターフェースの実装。

この簡略図は、この関係を理解するのに役立ちます。

NET標準インターフェイスの類推

ターゲティングNetCore10はすべて、INetStandard15API および NetCore10 特定の API(などDotNetHostPolicy)にアクセスできます。

もちろん、このライブラリは異なるINetStandard15実装でNetCore10は使用できません(NetFramework462またはに変換できませんMono46)。

代わりに、INetStandard15API へのアクセスのみが必要な場合(および具体的なフレームワークではなくその仕様を対象とする場合)、ライブラリは、それを実装する任意のフレームワーク(、など)で使用できます。NetCore10NetFramework462

注:最初のアナロジーでは、David Fowlerが.NET Standardバージョンとフレームワーク実装の両方にインターフェースを使用していました。代わりに、インターフェースとクラスを使用する方が直感的であり、仕様と具体的な実装との関係をよりよく表すと思います。


2
これを本当にありがとう。しかし、私には疑問があります。.net標準がインターフェイスであり、たとえば.netフレームワークと.net Coreを使用して実装できる場合、.net標準クラスライブラリを作成し、このライブラリを別のプロジェクトで使用すると、どの実装が使用されているか、netフレームワークまたは.net芯?
アルバロガルシア

8
コンパイルされたアプリケーションの実装を使用します(それが何であっても)。NET
コアアプリ

5
この図は、コア、標準、フレームワークの関係を説明する上で非常に役立ちます。
ジャスパー2017

そのため、net461コンソールアプリを作成し、netstandard2.0ライブラリをターゲットにすると、その標準ライブラリの何もコンソールアプリで解決されません。そう... ??
Sinaesthetic

2
写真は千の言葉の価値がある
Nikaas

182

.NET Coreは.NET Standardの実装です。複数のオペレーティングシステムで利用できますが、同じことではありません。.NETStandardの他の実装もあります。

したがって、.NET Coreライブラリを作成すると、.NET Coreで実装されているものにアクセスできますが、.NET Standardの一部ではなく、ライブラリは.NET Standardの他の実装と互換性がありません。 Xamarin、Tizen、フル.NETデスクトップフレームワークなど

つまり、最大限の移植性を実現するには、ライブラリを.NET Standardをターゲットにします。


5
@ÁlvaroGarcía:互換性があるとはどういう意味ですか?.NET Core 1.0?必ずしもそうとは限りません-.NET Core 1.0にはまだ追加のものが含まれている可能性があるためです。そのエントリは、.NET Standard 1.6を対象とする場合、Mono 4.6 .NET Core 1.0の両方でコードを実行できることを意味します。
ジョンスキート2017年

4
.NET Coreアセンブリは、.NET Core(CoreCLRおよびCoreFX)以外では実行できません。関連する標準(1.3、1.6、2.0など)の契約上の義務を満たしている任意のフレームワークで.NET標準アセンブリを実行できます。
Mark Rendle、

2
クロスプラットフォームとは、フレームワークではなくオペレーティングシステムを指します。
Mark Rendle、

15
類推として、.NET Standardをインターフェイスとして想像してみてください(例:)INetStandard16。.NET Core 1.0とMono 4.6の両方が実装されていINetStandard16ます。.Net Core 1.0をMono 4.6(およびその逆)に変換することはできませんが、を使用INetStandard16するものはどちらでも機能します。(David Fowlerへのクレジット)
フェデリコディプーマ

6
これには驚きました。名前は逆に思えます。「コア」という名前の方が2つのうち最小のものだと思います...
jpmc26

6

.NET Core Classライブラリは基本的に.NET Frameworkライブラリのサブセットであり、APIが少ないだけです。.NET Core Classライブラリを使用すると、ランタイム間でコードを共有することが難しくなります。このコードには必要なAPIがないため、別のランタイム(Mona for Xamarin)では機能しない可能性があります。これを解決するために、使用できるAPIを通知する仕様のセットである.NET標準があります。.NET標準の主な目的は、ランタイム間でコードを共有することです。そして、この仕様がすべてのランタイムによって実装されることが重要です。(.NET Framework、.NET CoreおよびMono for Xamarin)。

したがって、ライブラリを.NET Coreプロジェクトのみに使用することが確実である場合は、.NET Standardを無視できますが、コードが.NET FrameworkまたはMono for Xamarinによって使用される可能性が少しでもある場合は、より優れています。 .NET標準に固執する

また、.NET Standardの上位バージョンにはより多くのAPIが含まれていますが、下位バージョンはより多くのプラットフォームでサポートされています。したがって、ランタイム間で共有したい.NET標準ライブラリを作成する場合は、できる限り低いバージョンをターゲットにすることで、ほとんどのプラットフォームに到達できます。たとえば、.NET Framework 4.5および.NET Core 1.0で実行する場合、使用できる最も高い.NET Standardバージョンは.NET Standard 1.1です。詳細については、ドキュメントのこの素晴らしい表を参照しください。

PS:また、ライブラリを.NET Standardに変換する場合は、.NET Portability Analyzerが役立ちます。


4

.NET Standardは、.NET実装で使用できるように意図された.NET APIの仕様です。これにより、すべての.NET実装に対して統一されたBCL APIセットを定義できます。

.NET Coreは、.NET Standardのそのような実装の1つです。.NET Frameworkは、.NET Standardのもう1つの実装です。

.NETブログからの画像

ここに画像の説明を入力してください

Federicosの回答は、各フレームワークがバージョンとともにどのように進化するかについてグラフィカルな概要を示します。Microsoft Docsの以下の図をご覧ください。

ここに画像の説明を入力してください

.NET Standardをターゲットにするとプラットフォームのサポートが向上しますが、.NET Core(または.NET Framework)などの特定の.NETプラットフォームをターゲットにすると、そのプラットフォームのすべてのプラットフォーム機能を使用できるようになります。


2

.NET Standardは、すべての.NET実装が提供する必要のあるAPIの仕様です。.NETファミリに一貫性をもたらし、あらゆる.NET実装から使用できるライブラリを構築できるようにします。共有コンポーネントを構築するためのPCLを置き換えます。

.NET Coreは、ASP.NET Coreを使用してコンソールアプリケーション、Webアプリ、クラウドサービスを構築するために最適化された.NET標準の実装です。そのSDKには、Visual Studio開発に加えて、完全なコマンドラインベースの開発ワークフローをサポートする強力なツールが付属しています。これらの詳細については、aka.ms / netstandardfaqおよびaka.ms/netcore参照してください


: -マイクロソフトによる以下の非常に役に立つの記事(2017年9月MSDN)で見つけることができます一緒にもののほとんどの非常に明確な説明と、上記のはこの質問で議論.NET標準-神秘を解く.NETのコアと.NETの標準


0

.NET Frameworkのことですか?.NET標準は、.NET Framework、.NET Core、Xamarinなどの実装であるためです。

Linuxでホストできるため、.NET Coreが大好きです(私の経験ではnginxを使用)。IISでのみホストできる.NETフレームワークとは異なります。この場合、ホスティング予算について検討できます(Windowsサーバーは私にとって高価であるため)。

では、開発環境の視点、ネットコアは、軽量です。したがって、Visual Studioだけでなく、VSCode、Sublime、IDEを使用できます。


0

簡単に言うと、.NET標準は、dllにコンパイルされるクラスライブラリプロジェクトの記述に使用されます。.NET Coreは、すべてのオペレーティングシステム(Windows、Linux、MacOS)で実行できる実際のWebアプリケーションの開発に使用できます。(.NET Core 3では、MicrosoftはWPFを使用してデスクトップアプリを開発する機能を提供していますが、これまではこれらのアプリはクロスプラットフォームではなく、Windowsシステムでのみ実行されます。将来的には、マイクロソフトもクロスプラットフォームにする可能性があります).NET標準ライブラリ/ dllは、.NET(.NETフレームワーク、.NET Core)を使用するすべてのアプリケーションで使用できます。つまり、.NET標準を.NETフレームワークと.NETコアの両方で使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.