Ответ 1
Вы ничего не сделали неправильно, это должно произойти. Если вы хотите, чтобы ваша новая DLL была добавлена в новый проект .NET Framework, вам нужно настроить таргетинг на .NET Standard 2.0 для вашей библиотеки, ожидая версию .NET Framework, которая изначально поддерживает как API, так и версии сборки. для 4.7.2 (в то время как .NET Framework 4.7.1 поддерживает все API-интерфейсы, были ошибки в том, как некоторые сборки были версиями, и поэтому инструментарий (VS 2017 15.5+) добавит дополнительные сборки, чтобы исправить это).
То, что вы видите, является побочным эффектом создания .NET-стандарта и поддержки поддерживаемых фреймворков. Это также зависит от выбранной вами стандартной версии .NET и инструментария, используемого для ссылки на пакет библиотеки.
В .NET Standard < 2.0, вы ссылаетесь на мета-пакет NETStandard.Library
, который, в свою очередь, ссылается на дополнительные пакеты (System.*
). Эти пакеты содержат эталонные сборки, которые составляют "Стандартный контракт стандарта .NET" - набор API-интерфейсов и имен сборки + версии.
Когда пакет NuGet, который вы создаете для .NET Standard 1.0-1.6, затем ссылается на приложение, эти отдельные пакеты не приводят к сборкам ссылок, а скорее сборку реализации для рамки, на которую нацелено приложение.
Для .NET Core они соответствуют сборкам, которые уже являются частью среды выполнения, поэтому файлы 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, содержит System.Runtime.dll
, который содержит тип forward to.NET Framework mscorlib.dll
..NET Core уже содержит другой System.Runtime.dll
, который делает что-то другое для этой платформы. Этот механизм позволяет одному DLL файлу работать на обеих платформах, поскольку эти типы вперед и дополнительные реализации обеспечивают тот же "контракт" (типы + сборки или сборки), работающие на обеих реализациях.
.NET Standard 2.0 направлен на сокращение количества пакетов и DLL, необходимых, а также на удаление требуемых обновлений до NETStandard.Library
при выпуске новой версии .NET Core.
Итак, для .NET Standard 2.0 и .NET Core 2.0 пакет NETStandard.Library
содержит только сборки ссылок для компиляции кода для проекта, но полученный пакет NuGet больше не зависит от этого пакета. Поэтому, когда вы создаете библиотеку с таргетингом на .NET Standard 2.0 и публикуете ее, она не будет иметь зависимостей NuGet (если вы не добавите дополнительные).
Логика того, что "библиотеки поддержки" вводить при использовании библиотеки .NET Standard, была перенесена на оснастку, которая используется во время сборки. Поэтому, когда библиотека, содержащая ссылку на netstandard.dll
, добавляется в проект .NET Framework, инструментарий затем добавляет необходимые DLL файлы поддержки на основе используемой версии .NET Framework. Это было сделано для .NET Standard 2.0, а также для .NET Standard 1.5+, поскольку .NET Framework 4.6.1 ретроактивно была совместима с .NET Standard 2.0 (ранее была 1.4) с помощью этих DLL файлов. Тот же инструмент также гарантирует, что даже если пакеты NuGet каким-то образом включены в такой проект приложения, любые библиотеки реализации .NET Standard, созданные через NuGet, удаляются из сборки. Поэтому, если вы ссылаетесь на пакет .NET Standard 1.0 NuGet, который был создан при выпуске .NET Core 1.0, все его зависимости NuGet обрезаются, и вместо этого вы получаете библиотеки поддержки, поставляемые с инструментами построения.
Идея заключалась в том, что .NET Framework 4.7.1 будет содержать все необходимые сборки "inbox", так что netstandard.dll
, System.Runtime.dll
и т.д. являются частью .NET Framework и любого DLL файла .NET Standard 1.0-2.0 будет "просто работать", проблема в том, что эти DLL файлы "inbox" имели слишком низкий номер версии для некоторых сборок, поэтому библиотеки не могли загрузиться - это было исправлено путем изменения инструментария снова, чтобы включить DLL файлы с более высокими номерами версий в качестве поддержки библиотеки, которые, в свою очередь, переходят к сборкам "входящих".NET Framework. Это планируется установить в .NET Framework 4.7.2.