C#不同程序集下Public与Internal访问权限生效规则疑问
问题核心原因
C# 的访问修饰符(internal、private、protected 等)属于编译期语法约束,而非运行时的强安全限制,你的代码能正常运行主要基于两个前提:
- 你通过反射(
Assembly.Load+Activator.CreateInstance)创建实例的操作是运行时行为,完全绕过了编译期的访问修饰符检查。默认本地运行的 .NET 应用拥有 FullTrust 信任等级,运行时允许反射创建非公开类型的实例,不需要目标类型声明为public。 - 你创建
InternalClass实例后直接将其转换为项目 B 中声明的公开父类Execute,后续所有操作都基于Execute的公开成员实现,没有直接访问InternalClass本身的非公开成员,不会触发额外的访问校验。
补充说明
- 如果没有给项目 C 添加
[assembly: InternalsVisibleTo("项目B的程序集名称")]特性,你尝试在项目 B 中直接编写new InternalClass()代码时,编译阶段就会直接报错,这就是internal修饰符本来的约束作用。 - 如果你后续尝试通过反射访问
InternalClass自己声明的非公开方法/属性,同样不需要它声明为 public,只要权限足够就可以访问;只有在低权限运行环境(比如部分沙箱环境)中,反射创建非公开类型的操作才会抛出权限异常。
内容的提问来源于stack exchange,提问作者Josef Širůčka
相关产品推荐
相关产品推荐

