Вы можете (и должны) делать многоцелевой таргетинг.
Target netstandard2.0
и netstandard2.1
, для netstandard2.0
ссылка на 2.x (самый низкий, который работает для вас, проб 2.0, не должно быть никаких критических изменений в 2.x) и для netstandard2.1
ссылаться на версии 3.x.
Почему?
Поскольку это основной скачок версии, обычно заканчивающийся новым apis, удалением старых или изменением сигнатур методов (другими словами: внесение изменений) и поскольку netstandard2.1
требует .NET Core 3.0, поэтому и приложения, ссылающиеся на него, полагаются на поверхность APi Microsoft.Extensions.*
3.x версии
Чтобы условно ссылаться на пакет, выполните
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0"/>
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0"/>
</ItemGroup>
В качестве альтернативы
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0" Condition=" '$(TargetFramework)' == 'netstandard2.01' "/>
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0" Condition=" '$(TargetFramework)' == 'netstandard2.1' "/>
тоже работает, но менее читабельно. При этом все равно будет создан один NugetPackage, но в нем будут две папки netstandard2.0
и netstandard2.1
с двумя отдельно скомпилированными сборками, ориентированными на разные версии.
Когда этот пакет восстанавливается в .NET Core 3, он будет использовать версию netstandard2.1
, а при восстановлении в .NET Core 2.x он будет использовать netstandard2.0
.
Если естьРазличаются API, вы должны использовать директивы препроцессора в вашем коде
#if NETSTANDARD2_0
// API call of 2.x library
#elif NETSTANDARD2_1
// Api call of 3.x library
#endif