web-dev-qa-db-ja.com

.NET Standard、.NET Core、PCL

.NET Standardは紛らわしい概念です。標準の.NETライブラリ形式のアイデアは素晴らしいですね。しかし、それが正確に何であるかは明確ではありません。 Visual Studioには、古いPCLプロジェクトと同様に、.NET Coreおよび.NET Standard Class Libraryプロジェクトテンプレートがあります。また、プロジェクトの設定に移動すると、既存のPCLライブラリを.NET Standardに切り替えることができることもわかりました。 .NET標準がライブラリかどうかは明らかではありませんか?またはDLL=形式。

私が尋ねている基本的な質問は、どのタイプのライブラリをターゲットにするべきですか?私は主にXamarinプロジェクトのためにこれをやっていますが、素晴らしいでしょうこれらのライブラリを他のプラットフォーム、特に.NET CoreおよびUWPと共有できれば。 Microsoftが.NET Coreと.NET Standardの2つの一見同一のクラスライブラリタイプを同時に導入した理由については混乱しています。

定義

NET Core-.NET標準API定義に準拠する.NETベースのランタイム環境。

[〜#〜] pcl [〜#〜]-.NET、Mono、UWPなどのいくつかのランタイム環境でサポートされる.NETベースのライブラリ形式などなど

。NET Standard(Definition 1)-.NETベースのランタイム環境用の標準API定義のセット

。NET Standard(Definition 2)-.NET、Mono、UWPなどを含むいくつかのランタイム環境でサポートされる.NETベースのライブラリ形式PCL形式の続き。 Visual Studioでは、プロジェクトのプロパティに移動してターゲットフレームワークを編集することにより、PCLライブラリを.NET標準ライブラリに変換できます。

42

これはサミュエル・エングラードから( https://github.com/dotnet/corefx/issues/973#issuecomment-249582799 ):

.NET DLLは、ECMA-335(Common Language Infrastructureとして知られている)に従ってフォーマットされています。この形式は、.NETと呼ばれるすべてのプラットフォームに当てはまります。フルフレームワーク、コア、Xamarin、Mono、Silverlightなど.

あるプラットフォームに対して別のプラットフォームに対してコンパイルされたDLLを使用できなかった理由は、形式がAPIを指定していないためです(一般的に言えば)。したがって、すべてのユーザーがDLLを読み取ることができましたが、あるプラットフォームでは名前空間A.B.Cに、別のプラットフォームでは名前空間D.E.Fに存在するクラスXYZの問題に遭遇します。

PCLは、2つのことを行うことでこれを「解決」しました。

名前空間A.B.CでクラスXYZを想定してコードを記述した場合でも、他の場所にあるプラットフォームで見つけることができるように、Type Forwardingを使用しました。使用できるAPIを、必要なすべてのプラットフォームで共有される最小の共通セットに制限しました。

PCLを取得して.NET Standardプロジェクトに変換するのは、出力形式のためではなく、メタデータが含まれているため(特にタイプ転送)、再コンパイルではありません。

したがって、.NET標準ライブラリは、異なる標準化されたAPIセットの上にレイヤーを配置するという事実を除いて、本質的に.NET標準ライブラリと変わらないと思います。

.NET Coreはもちろんランタイム環境ですが、.NET Standardと非常に密接に連携していると思います。 .NET Standard APIを実装しているという事実以外には、特別な関係はないと思います。

私の考えでは、複数のプラットフォーム間で互換性があるため、一般に.NET標準クラスライブラリをターゲットにした方が良いでしょう。 .NET Coreをターゲットとする場合、このアセンブリタイプは、たとえばUWPで参照できません。これが表示されます:

enter image description here

ただし、純粋な.NET Core環境で作業している場合は、.NET Coreランタイム環境に固有のAPIが利用できるため、ターゲットを設定する必要がある場合があります。 .NET Coreを直接

この用語集をご覧ください: https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md

9

これに関するドキュメントは確かに混乱していますが、おおよそ次のように理解できます。

  • PCL:一連のプラットフォームをターゲットとするライブラリ(これらのプラットフォームのAPIの「最小公分母」を持っています)。したがって、PCLを作成するとき、プラットフォームA、B、Cをターゲットにしたいということです。

  • .NET標準:プラットフォームではなく、「標準」のAPIセット。したがって、基本的にはプラットフォームを気にせず、標準(バージョン1.3、1.6 ...)だけで、コードはそれをサポートするすべてのプラットフォームで動作します。

  • ここで.NETコアを混同しないでください。これは.NETフレームワークの「別のバージョン」です。 .NET標準はランタイム間で機能します(.NETフレームワーク、.NETコア、Mono)

だから私は.NET標準が行く方法だと思う:)

25
user3151814

このリソースがあなたの質問のほとんどに答えると信じています。

https://docs.Microsoft.com/en-us/dotnet/articles/standard/library

.NET標準ライブラリは、.NET APIの正式な仕様であり、すべての.NETランタイムで使用できるようになっています。標準ライブラリの背後にある動機は、.NETエコシステムの均一性を高めることです。

私が理解しているように、他のライブラリタイプはプラットフォーム固有であり、.NET標準はある程度プラットフォームに依存しません。

異なるプラットフォームでコードを使用したい場合は、.NET標準が理想的と思われますが、他のプラットフォームがサポートする.NET標準のバージョンに注意してください(リンクの表を参照)。

お役に立てれば

9
hburton

標準は、Android APIバージョンに似たAPIの特定のセットをターゲットとするためのものです。nugetライブラリは、標準を確認するすべてのライブラリを含む単なるメタパッケージです。

MSDEVショーのScott Hunterは、この概念を非常によく説明しています。それをチェックアウトする価値- http://msdevshow.com/2016/07/dot-net-core-with-scott-hunter/

3
lazy