あなたは何か間違ったことは起こっていませんが、これは起こると予想されます。独自のDLLを新しい.NET Frameworkプロジェクトに追加するだけの場合は、ライブラリ用の.NET Standard 2.0をターゲットにして、.NET Frameworkのバージョンを待つ必要があります。これは、APIとアセンブリのバージョンの両方をネイティブにサポートします(.NET Framework 4.7.1はすべてのAPIをサポートしていますが、一部のアセンブリのバージョン管理方法にバグがあり、ツール(VS 2017 15.5+)がそれを修正するためにアセンブリを追加することになります)。
.NET Standardがどのように構築され、サポートされているフレームワークのサポートが実装されているかの副作用が見られます。これは、対象とする.NET Standardバージョンと、ライブラリパッケージを参照するために使用されたツールに基づいても異なります。
.NET標準<では、NETStandard.Library
メタパッケージを参照し、追加パッケージ(System.*
)を参照しています。これらのパッケージには、 ".NET Standard Contract"(APIのセットとアセンブリ名+バージョン)を構成する参照アセンブリが含まれています。
.NET Standard 1.0-1.6用に作成したNuGetパッケージをアプリケーションが参照すると、これらの個々のパッケージは参照アセンブリを持ち込まず、アプリケーションが対象とするフレームワークの実装アセンブリを取り込みます。
.NETコアの場合、これらはランタイムの一部であるアセンブリと一致します。したがって、DLLファイルはビルドされたアプリケーションの隣にありません。しかし、.NET Core 1.1(NETStandard.Library
バージョン1.6.1)用の新しいパッケージがリリースされたときに変更されました。その結果、.NET Core 1.0用に構築されたアプリケーションでは、.NET Core 1.1に含まれるようになった新しい実装アセンブリが完成しました(幸いなことに、1.1は「長期サポート」バージョンとなりました。 LTSの約束の一部です)。
.NET Frameworkでは、これらのライブラリ(一部の例外を除き、System.Net.Http
など)はあまり機能しません。システムアセンブリに転送するだけです。したがって、例えば、 "契約"はSystem.Object
がSystem.Runtime.dll
アセンブリで定義されていることを定義します。したがって、System.Runtime.dll
ファイルが.NET Frameworkアプリケーションで完成すると、にはforward to .NET Frameworkのタイプmscorlib.dll
が含まれています。 .NET Coreにはすでに、異なるプラットフォームの異なるSystem.Runtime.dll
が含まれています。このメカニズムは、両方のプラットフォームで動作する単一のDLLファイルを可能にします。これらのタイプの転送と追加の実装は、両方の実装で動作する同じ「コントラクト」(型+アセンブリ+アセンブリバージョン)を保証します。
.NET Standard 2.0は、必要なパッケージとDLLの数を減らし、新しい.NETコアバージョンがリリースされるたびにNETStandard.Library
に必要な更新を削除することを目的としていました。
.NET Standard 2.0および.NET Core 2.0の場合、NETStandard.Library
パッケージはコードをコンパイルするための参照アセンブリのみをプロジェクトに持ち込みますが、NuGetパッケージはこのパッケージに依存しません。したがって、.NET Standard 2.0をターゲットとするライブラリを作成して公開すると、NuGetの依存関係はなくなります(追加しない限り)。
.NET標準ライブラリを使用するときに "サポートライブラリ"が持ち込むロジックは、ビルド中に使用されたツールに移動されました。したがって、netstandard.dll
への参照を含むライブラリが.NET Frameworkプロジェクトに追加されると、ツールは使用されている.NET Frameworkのバージョンに基づいて必要なサポートDLLを追加します。これは、.NET Framework 2.0および.NET Standard 1.5以降で実行されました。これは、.NET Framework 4.6.1がこれらの種類のDLLファイルを介して.NET Standard 2.0(以前は1.4)と遡及的に互換性があったためです。同じツールを使用すると、たとえNuGetパッケージが何らかの形でそのようなアプリケーションプロジェクトに持ち込まれたとしても、NuGetを介して取り込まれた.NET Standard実装ライブラリはすべてビルドから削除されます。したがって、.NET Core 1.0がリリースされたときにビルドされた.NET Standard 1.0 NuGetパッケージを参照すると、そのNuGetの依存関係はすべて削除され、代わりにビルドツールに付属するサポートライブラリが取得されます。アイデアはnetstandard.dll
、System.Runtime.dll
などは、.NET Frameworkの一部及び任意の.NET標準1.0-2.0 DLLファイルになるように、.NET Frameworkの4.7.1は、「受信トレイ」に必要なすべてのアセンブリが含まれているというものであった
でしょう「だけ問題は、これらの「受信ボックス」dllファイルのライブラリがロードに失敗するように、いくつかのアセンブリのバージョン番号が低すぎるということでした。これは、サポートツールとしてバージョン番号の高いDLLファイルを組み込むようにツールを変更することで修正されました。 「受信ボックス」.NET Frameworkアセンブリに転送します。これは、.NET Framework 4.7.2で修正される予定です。
実際に出力フォルダに何かが追加されているのか、それともパッケージをインストールするときにそれが依存関係の恐ろしいリストになっているのか分かりませんか?私の経験はそれが後者であることです。それはまだ偉大ではありませんが、心配するものではありません。 –
@JonSkeet私のパッケージフォルダには、本当に1つだけ期待していたときに、長いフォルダリストが表示されるようになりました。加えて、「NuGetパッケージを管理する」画面にはすべてのパッケージが表示されます(一部は更新が保留中です)。 –
右 - binディレクトリには何がありますか? (FWIW、私はこれが非常に残念な状況だと完全に同意します。後のリリースで改善されているかどうかはわかりません。しかし、これが私が生産するいくつかのパッケージでは、net45ターゲットとnetstandard1.xバージョンを作成する理由です...) –