Как создать библиотеку.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,

Победитель победителя, куриный ужин!

Другие вопросы по тегам