2

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

  • 网络标准 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版本。

谢谢!

4

2 回答 2

3

您可以有条件地定义依赖项,具体取决于构建项目的当前目标框架。为此,您将调整项目文件以在一种情况下使用 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的正常程序集引用,可以从 GAC 或本地目录中解析,其他框架将使用.Microsoft.Build.FrameworkReferencePackageReference

于 2018-07-23T10:26:52.833 回答
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>

所以在这里,如果框架是,我们将从 NuGet 获取包,NS20而我们尝试从 GAC 获取包(如果它是用于NET452.

优胜者,鸡肉晚餐!

于 2018-07-23T10:26:18.103 回答