2017-08-17 9 views
1

.NET Core 2.0 SDKの各DLLは、2つのコピー(コンテンツとファイルサイズが異なります)で提供されます。.NET Core 2.0 SDKのlibフォルダとrefフォルダの.DLLの違いは何ですか?

"C:\プログラムファイル\のDOTNET \ SDK \マイクロソフト\ 2.0.0 \ Microsoft.NET.Build.Extensions \ net461 \ refの\ System.Threading.Thread.dll"(14432バイト)

例えば

"C:\プログラムファイル\のDOTNET \ SDK \ 2.0.0のMicrosoft \ Microsoft.NET.Build.Extensions \ \ net461 \ libに\ System.Threading.Thread.dll"(14352バイト)

違いは何それらの間に(そして2つを持つ目的)?

+2

基本的に完全なフレームワークと異なるわけではありませんが、参照アセンブリはc:\ program files(x86)\ referenceアセンブリにあり、プログラムの作成時に使用されます。ランタイムアセンブリはc:\ windows \ microsoft.net \ assemblyにあり、プログラムの実行時に使用されます。この違いは、実装変更がプログラムを壊すリスクを最小限に抑えます。 .NETCoreはあなたのディスクをもっと悪く、あまりにも多くのバージョン、あまりにも多くのアセンブリ、あまりにも多くの標準、そしてGACなしで置き去りにするだけです。うまくいけば、彼らはいつか一緒に行動するでしょう。 –

+2

'Microsoft.NET.Build.Extensions'は実際には.NET Standard 1.0-2.0プロジェクトを.NET Framework 4.6.1上で実行できるようにするための互換性シムです。これには必要なアセンブリとタイプがすべて含まれていません。古典的な 'ref' /' lib'分割の他のNuGetパッケージよりも少し特別です。 –

答えて

2

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.ObjectSystem.Runtime.dllから参照し、.NET Standard 2.0ライブラリはnetstandard.dllから参照します。 Microsoft.NET.Build.Extensionsには、.NET Frameworkのmscorlib.dllに転送する型転送の宣言を含むSystem.Runtime.dllnetstandard.dllの両方が含まれています。これは他の型やアセンブリでも同様です。

これらのアセンブリは、必要な場合にのみ追加されます。 .NET Framework 4.7.1にはこれらのアセンブリと転送がすべて含まれるため、ビルド出力に追加ファイルは追加されません。

関連する問題