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

