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

移除Project A对C的直接引用后仍可编译,.NET Framework项目间接引用是否为正常机制?

移除Project A对C的直接引用后仍可编译,.NET Framework项目间接引用是否为正常机制?

嗨,这事儿太常见了!你遇到的完全是.NET Framework项目系统的默认正常行为,不是什么bug或者本地缓存问题~

先理清楚你的场景:

  • 最初的引用链是 A→B、A→C、B→C,编译正常
  • 移除A对C的直接引用后,只剩A→B、B→C,结果A不仅能编译,还能直接用C里的类

这是因为在.NET Framework里,项目引用默认是传递性的——当你让A引用B时,B的所有依赖(包括它引用的其他项目C)会自动被引入到A的编译环境中,而且这些依赖的程序集会被复制到A的输出目录,A的代码也能直接访问这些依赖里的公开类型。

这种设计在早期是为了简化配置,避免开发者手动去加一堆间接依赖,但它也有个小坑:比如你可能无意间在A里用了C的类型,之后如果B移除了对C的引用,A的代码就会突然编译失败,因为之前的间接依赖没了。

而且你说Jenkins CI/CD里也能正常编译,这完全合理,因为这是项目系统的内置行为,和本地环境无关,只要是基于.NET Framework的项目系统,都会这么处理。

如果想要禁用这种传递性引用,不让A间接拿到C的依赖,你可以手动修改A的项目文件(.csproj):找到A对B的引用节点,加上<ExcludeAssets>ProjectReferences</ExcludeAssets>,比如:

<ProjectReference Include="..\ProjectB\ProjectB.csproj">
  <Project>{你的ProjectB的GUID}</Project>
  <Name>ProjectB</Name>
  <ExcludeAssets>ProjectReferences</ExcludeAssets>
</ProjectReference>

改完之后,A就只会引用B本身,不会继承B的项目依赖了,这时候再移除A对C的直接引用,编译就会报错,符合你预期的“没有直接引用就不能用”的逻辑。

备注:内容来源于stack exchange,提问作者Simon Bosley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:13:00