跨程序集公共访问修饰符疑问:ASP.NET Core 8项目引用权限问题
项目引用是否会传递暴露依赖项目的公共成员?
我正在开发一个ASP.NET Core 8项目,解决方案结构如下:
- ProjectA
- ClassA(公共类)
- LibraryB
- 引用ProjectA项目
- ClassB(内部类,实现IClassB)
- LibraryC
- 引用LibraryB项目
- ClassC
public class ClassA { public void Foo(); } internal class ClassB : IClassB { private ClassA a; public ClassB(ClassA a) { this.a = a; } public void Bar() { a.Foo(); } } // Project C通过DI获取IClassB实例 public interface IClassB { void Bar(); } public class ClassC { public void DoSomething() { // 这里居然可以直接创建ClassA的实例,这让我很意外! var a = new ClassA(); a.Foo(); } }
我意外发现LibraryC中可以直接创建ClassA的实例,想请教:项目引用是否会让引用方获得被引用项目及其所有依赖项目的公共成员访问权限?
是的,.NET的项目引用默认是传递性的。当LibraryB引用ProjectA、LibraryC再引用LibraryB时,ProjectA会自动成为LibraryC的间接依赖,LibraryC就能访问ProjectA里所有标记为public的成员(比如公共类、公共方法等)。
这种默认行为是为了简化依赖管理——既然LibraryB的正常运行依赖ProjectA的公共接口,那引用LibraryB的项目自然也需要能访问这些接口,不然很可能出现编译错误。
如果想阻止这种传递暴露,你可以在LibraryB引用ProjectA时禁用传递性:
- 在Visual Studio中,右键LibraryB的项目引用→选中ProjectA→打开属性面板,将「私有」选项设为True;
- 或者直接编辑LibraryB的
.csproj文件,给ProjectA的引用添加PrivateAssets="all":
<ProjectReference Include="..\ProjectA\ProjectA.csproj"> <PrivateAssets>all</PrivateAssets> </ProjectReference>
设置后,LibraryC引用LibraryB时就看不到ProjectA的内容了,只能访问LibraryB对外暴露的成员(比如IClassB接口)。
内容的提问来源于stack exchange,提问作者jessiebot
相关产品推荐
相关产品推荐

