.NET多目标构建依赖解析:中间项目是否需改为多目标?
问题解答
默认情况下,构建不会自动解析到A的net9.0-windows版本,原因如下:
- 项目B是单目标
net9,它在自身构建时只会引用项目A的net9版本(而非Windows专属版本),并将这个依赖关系固化到自身的输出中。 - 当项目C构建
net9.0-windows版本时,虽然C的TFM兼容net9,但它从B传递过来的依赖依然是A的net9版本,无法自动切换到A的Windows专属版本。
要实现C的Windows版本匹配A的Windows版本,有两种可行方案:
方案1:将项目B改为多目标构建
直接给B添加net9.0-windows目标框架,修改B的csproj文件:
<TargetFrameworks>net9;net9.0-windows</TargetFrameworks>
这样当C构建net9.0-windows版本时,会触发B构建对应的net9.0-windows版本,而B的Windows版本会自动引用A的net9.0-windows版本,最终传递给C的就是A的Windows专属逻辑。这种方式逻辑清晰,后续扩展其他平台时维护成本低,是推荐方案。
方案2:在项目B中配置条件化引用
如果不想修改B的目标框架,可以在B的csproj中通过条件判断,让它在被Windows平台项目引用时指向A的Windows版本:
<ItemGroup> <!-- 非Windows平台时,引用A的net9版本 --> <ProjectReference Include="..\A\A.csproj" Condition="!$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net9.0-windows'))" /> <!-- Windows平台时,强制引用A的net9.0-windows版本 --> <ProjectReference Include="..\A\A.csproj" Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net9.0-windows'))" AdditionalProperties="TargetFramework=net9.0-windows" /> </ItemGroup>
这种方式无需修改B的目标框架,但配置相对繁琐,适合仅需适配Windows单一平台的场景。
内容的提问来源于stack exchange,提问作者ElDog
相关产品推荐
相关产品推荐

