.NET Core为何允许通过项目依赖直接访问程序集?
为什么.NET Core允许跨层程序集访问,而.NET Framework不行?
这个问题的核心差异在于两种框架的程序集依赖解析机制完全不同,咱们掰开了说:
1. .NET Framework的「显式非传递引用」逻辑
在.NET Framework里,程序集引用是显式且隔离的:
- 当Layer3引用Layer2时,Layer2自己依赖的Layer1属于Layer2的「私有依赖」,默认不会被“暴露”给Layer3。
- 编译器只会查找Layer3项目文件里明确声明的引用,所以它看不到Layer1,自然会抛出找不到类型的错误。
- 如果你想让Layer3访问Layer1,必须手动在Layer3的项目里添加对Layer1的引用,没有捷径。
2. .NET Core/.NET Standard的「默认传递依赖」逻辑
而.NET Core(包括.NET 5及以后版本)从设计上就适配了现代包管理的思路,采用默认传递依赖模型:
- 当Layer3引用Layer2时,Layer2的所有依赖(比如Layer1)会自动被加入到Layer3的依赖图谱中,编译器会自动识别这些传递过来的依赖。
- 只要Layer1里的类型是
public可见的,Layer3不需要手动添加任何引用,就能直接访问Layer1的内容——这就是你看到的“跨层访问”现象。
3. 如何在.NET Core里模拟.NET Framework的隔离效果?
如果你想回到.NET Framework那种私有依赖隔离的行为,也完全可以做到:只需要在Layer2对Layer1的引用中,设置<PrivateAssets>all</PrivateAssets>,把Layer1标记为Layer2的私有资产,阻止它被传递给上层项目。
举个实际的例子,修改Layer2项目文件里的ProjectReference节点:
<ProjectReference Include="..\Layer1\Layer1.csproj"> <PrivateAssets>all</PrivateAssets> </ProjectReference>
这样设置后,Layer3就再也访问不到Layer1了,和.NET Framework的行为完全一致。
内容的提问来源于stack exchange,提问作者Flores
相关产品推荐
相关产品推荐

