.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
相关产品推荐
相关产品推荐

