Как создать библиотеку.NET Core с многоцелевым таргетингом, но нацеленную на разные dll для каждой среды?
Я пытаюсь обновить библиотеку, которая в настоящее время нацелена на.NET4.0, чтобы:
- NETStandard 2.0
- NET4.5.2
используя Multi-Targeting.
Я использую зависимую библиотеку Microsoft.Build.Framework
, Это найдено либо в двух местах:
NuGet
и минимальный уровень NET4.6- GAC через Full Framework (например,
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.Build.Framework.dll
)
Поскольку минимальный уровень пакета nuget выше 4.5.2, я не могу использовать этот пакет nuget в цели 452.
Итак, можно ли сказать: - При использовании NS20, пожалуйста, используйте пакет nuget. - При использовании NET4.5.2, пожалуйста, используйте версию GAC.
Спасибо!
2 ответа
Вы можете определить свои зависимости условно, в зависимости от того, на какой текущей целевой структуре строится проект. Для этого вы должны настроить файл проекта так, чтобы в одном случае использовались зависимости NuGet, а в другом - стандартные ссылки, отличные от NuGet.
Это будет выглядеть так:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- other properties -->
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<!-- common references -->
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net452'">
<Reference Include="Microsoft.Build.Framework" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'net452'">
<PackageReference Include="Microsoft.Build.Framework" Version="15.7.179" />
</ItemGroup>
</Project>
Так net452
получил бы нормальную ссылку сборки Microsoft.Build.Framework
с Reference
элемент, который может быть разрешен из GAC или локального каталога, и другие платформы будут разрешать его из NuGet, используя PackageReference
,
Хитрость в том, чтобы изменить ваш csproj
и укажите вручную пакеты для использования в любой конкретной среде.
Итак, вот что я в итоге сделал. Сделать заметку о:
PackageReference
: получить это от NuGet.Reference
Получите это от вашего GAC.
,
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="Microsoft.Build.Framework" Version="15.7.179" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.7.179" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net452' ">
<Reference Include="Microsoft.Build.Framework" Version="15.7.179" />
<Reference Include="Microsoft.Build.Utilities.v4.0" Version="15.7.179" />
</ItemGroup>
Итак, мы получаем пакеты от NuGet, если NS20
в то время как мы пытаемся получить их от GAC, если это для NET452
,
Победитель победителя, куриный ужин!