大家都知道C#中访问权限有4个关键字(5种组合):
- private(私有访问级别内部可以使用)
- public(公开级别,无限制)
- internal(程序集访问级别,同一程序集内可访问)
- protected(保护级别,本类和子类可访问)
- internal protected=protected internal(同程序集且在本类或子类)
- 默认无修饰(对于类型等同internal,对于类型成员等同private)
这里要特别提到的是internal关键字,初一看有点像C++的friend但又有不同。internal仅限同一程序集中也不能自定义给谁打开“方便之门”。
在我们需要保护所写的类型或成员,但是我们的调用又不在同一程序集中那该怎么办?
在.NET2.0开始,提供了[AttributeUsageAttribute(AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]public sealed class System.Runtime.CompilerServices.InternalsVisibleToAttribute : Attribute 的特性。
我们只要在AssemblyInfo.cs中添加[assembly: InternalsVisibleTo("ConsoleApplication1 ,PublicKey= xxxxx")] 即可以再ConsoleApplication1中访问该程序集中internal 访问级别的类型和成员。