Hans Passantが既に述べたように、「参照」アセンブリはプログラムを構築するために使用されます。つまり、参照としてコンパイラに渡されるアセンブリです。ただし、実行時に実装が異なる場合があります。フレームワークとは別に、単一のコンパイル時参照アセンブリを配布するすべてのNuGetパッケージで使用できますが、各ターゲット(.NETコア、.NET Framework、MonoAndroidなど)にはさまざまな実装アセンブリが用意されています。 NuGetパッケージのlib
フォルダを使用して、より多くのプライベート実装アセンブリを追加して、アプリケーションを消費するアプリケーションが直接参照することを望まないようにすることもできます。
参照アセンブリには、使用可能なAPIサーフェスが定義され、コンパイラによって検査されるように、「スタブ」メソッドしかありません。
ただし、Microsoft.NET.Build.Extensions
という名前のフォルダがあります。それはNuGetパッケージの構造に従っています(これはSDKに組み込まれて統合されているためです)が、使用する通常のライブラリとはまったく異なる目的を持っています。これは、.NET標準ライブラリが.NET Frameworkの部分互換バージョンで実行できるようにするために使用されます。これは、ビルド出力に実装アセンブリを追加することで機能しますが、これらは対応する.NET Frameworkタイプに転送するだけで、.NET標準では使用可能で.NETでは実装されていないタイプに対してはPlatformNotSupportedException
をスローするAPIサーフェスを追加するので特別です。フレームワーク。例えば。 .NET Standard 1. *ライブラリはSystem.Object
をSystem.Runtime.dll
から参照し、.NET Standard 2.0ライブラリはnetstandard.dll
から参照します。 Microsoft.NET.Build.Extensions
には、.NET Frameworkのmscorlib.dll
に転送する型転送の宣言を含むSystem.Runtime.dll
とnetstandard.dll
の両方が含まれています。これは他の型やアセンブリでも同様です。
これらのアセンブリは、必要な場合にのみ追加されます。 .NET Framework 4.7.1にはこれらのアセンブリと転送がすべて含まれるため、ビルド出力に追加ファイルは追加されません。
基本的に完全なフレームワークと異なるわけではありませんが、参照アセンブリはc:\ program files(x86)\ referenceアセンブリにあり、プログラムの作成時に使用されます。ランタイムアセンブリはc:\ windows \ microsoft.net \ assemblyにあり、プログラムの実行時に使用されます。この違いは、実装変更がプログラムを壊すリスクを最小限に抑えます。 .NETCoreはあなたのディスクをもっと悪く、あまりにも多くのバージョン、あまりにも多くのアセンブリ、あまりにも多くの標準、そしてGACなしで置き去りにするだけです。うまくいけば、彼らはいつか一緒に行動するでしょう。 –
'Microsoft.NET.Build.Extensions'は実際には.NET Standard 1.0-2.0プロジェクトを.NET Framework 4.6.1上で実行できるようにするための互換性シムです。これには必要なアセンブリとタイプがすべて含まれていません。古典的な 'ref' /' lib'分割の他のNuGetパッケージよりも少し特別です。 –