You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET8项目引用多目标传递依赖,如何指定依赖的.NET版本?

.NET多目标项目引用版本不匹配问题

我有一个.NET6 SDK项目,为使用新功能需要升级到.NET8,但该项目与其他仍基于.NET6的项目共享类库。项目结构为:Project A 引用 Project B,Project B 引用 Project C。需求是A和C使用.NET8,同时B和C仍需支持.NET6项目。尝试将B和C设置为多目标(net6.0;net8.0),并将A升级到.NET8,但运行Project A时,它引用的C仍是.NET6版本。B和C均输出了net6.0和net8.0版本的DLL,但无法让A获取到新版本。

当前项目配置如下:

Project A csproj

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AssemblyName>A</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="B.csproj" AdditionalProperties="TargetFramework=net8.0" />
  </ItemGroup>
</Project>

Project B csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
    <AssemblyName>B</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="C.csproj" />
  </ItemGroup>
</Project>

Project C csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
    <AssemblyName>C</AssemblyName>
  </PropertyGroup>
</Project>

实际项目中还有更多依赖,可能存在其他项目或包的干扰,不确定当前配置下A无法获取C的.NET8版本的原因,请问如何实现这一需求?


解决方案

1. 确保传递性引用的目标框架匹配

当你为Project A指定引用B的net8.0版本时,B在构建net8.0目标时,默认会根据自身目标框架匹配C的对应版本,但如果没有明确约束,可能出现版本选择偏差。需要让B在构建不同目标框架时,引用对应版本的C。

2. 显式指定B对C的目标框架引用

修改Project B的ProjectReference,通过条件属性或AdditionalProperties指定不同目标框架下引用C的对应版本:

<ItemGroup>
  <!-- 为net6.0目标引用C的net6.0版本 -->
  <ProjectReference Include="C.csproj" 
                    AdditionalProperties="TargetFramework=net6.0" 
                    Condition="'$(TargetFramework)' == 'net6.0'" />
  <!-- 为net8.0目标引用C的net8.0版本 -->
  <ProjectReference Include="C.csproj" 
                    AdditionalProperties="TargetFramework=net8.0" 
                    Condition="'$(TargetFramework)' == 'net8.0'" />
</ItemGroup>

或者更简洁的方式,利用MSBuild自动目标框架匹配:

<ItemGroup>
  <ProjectReference Include="C.csproj">
    <SetTargetFramework>TargetFramework=$(TargetFramework)</SetTargetFramework>
  </ProjectReference>
</ItemGroup>

这个配置会让B在构建某个目标框架时,自动引用C的同版本目标框架。

3. 清理和重建整个解决方案

多目标项目构建后,bin/obj文件夹中会残留不同版本的DLL,可能导致引用混乱。执行以下步骤:

  • 删除所有项目的bin和obj文件夹
  • 在Visual Studio中选择"清理解决方案",然后"重建解决方案"
  • 或使用命令行:dotnet clean 后执行 dotnet build

4. 检查其他依赖的干扰

  • 查看解决方案中是否有其他项目或NuGet包强制指定了net6.0版本的依赖,比如通过PackageReference的TargetFramework约束
  • 检查项目的RuntimeIdentifier是否有冲突,确保所有相关项目的运行时标识一致(如果有指定的话)
  • 使用dotnet list package --include-transitive命令查看传递性依赖,确认是否有包强制拉低了C的版本

内容的提问来源于stack exchange,提问作者lrfalslev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:25:19