如何创建一个多目标但针对每个框架针对不同dll的.NET Core库?

时间:2018-07-23 10:06:30

标签: c# .net .net-core multi-targeting

我正在尝试将当前针对.NET4.0的库更新为:

  • NETStandard 2.0
  • NET4.5.2

使用多目标。

我正在使用的从属库为Microsoft.Build.Framework。在两个地方都可以找到它:

  • NuGet,最低级别为NET4.6
  • 通过完整框架的GAC(例如C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.Build.Framework.dll

因为nuget包的最低级别高于4.5.2,所以我无法在452目标中使用该nuget包。

因此,可以说: -使用NS20时,请使用nuget软件包。 -使用NET4.5.2时,请使用GAC版本。

谢谢!

2 个答案:

答案 0 :(得分:1)

诀窍是修改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>

因此,在这里,如果框架是NS20,我们将从NuGet获取软件包,而如果框架是NET452,我们将从GAC获取软件包。

优胜者,鸡肉晚餐!

答案 1 :(得分:1)

您可以根据构建项目的最新目标框架有条件地定义依赖项。为此,您可以调整项目文件以在一种情况下使用NuGet依赖项,在另一种情况下使用标准的非Nuu引用。

它看起来像这样:

<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将通过Reference element获得正常的程序集引用Microsoft.Build.Framework,可以从GAC或本地目录中解析它,其他框架则可以使用PackageReference