友元程序集
在上一节我们学习了C#语言里的四种修饰符,以及由它们组成的五种可访问性。现在我们知道Internal修饰的类型或成员的可访问性是在同一程序集内可访问,其它外部程序集将不能访问。但现在如果我们有一个这样的需求,A程序集中有一个classA的可访问性为internal,这样这个类就只能是A程序集内的其它类才能访问它,可是现在如果在不将修饰符改为public的情况下,想要让某些外部程序集也能够来访问这个类呢?
方案一:将该classA的修饰符改为protected internal(此时,classA不能是顶级类)
从上一节的学习知道,这种可访问性表示该class所在的程序集和该class的子类(子类可以是其它程序集),所以只要外部程序集里的某个类继承这个classA,那就可以访问该classA的成员。
缺点:1、classA不能是顶级类,因为顶级类的修饰符只能是public 和 internal.
2、外部想要访问的类必须要继承classA,这样会导致得到自己想要的东西的同时也带来了不想要的麻烦
方案二:将外部程序集声明为程序集A的友元程序集
友元程序集是.net2.0的新特性,友元程序集是一种可以访问其它程序集的Internal类型和成员的程序集。
下面贴代码说明:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.CompilerServices; 5 using System.Text; 6 using System.Threading.Tasks; 7 using System.Runtime.CompilerServices; 8 [assembly: InternalsVisibleTo("ConsoleApplication1")] 9 namespace ClassLibrary1 10 { 11 class A 12 { 13 internal string xxx; 14 public void getB() 15 { 16 17 } 18 } 19 }
这是一个类库,我们新建了一个类A,没有指定修饰符,这里你懂的。这里多了两个重要的东西,一个是using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("ConsoleApplication1")],这里表示将ConsoleApplication1这个程序集声明该程序集的友元程序集。
1 using ClassLibrary1; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ConsoleApplication1 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 A a = new A(); 15 } 16 } 17 }
奇迹出现了,在这里居然可以new 外部程序集的A.这样就实现了文章开头提出的需求了。
声明友元程序集还有另外一种方式
在AssemblyInfo.cs中声明
1 using System.Reflection; 2 using System.Runtime.CompilerServices; 3 using System.Runtime.InteropServices; 4 5 // 有关程序集的常规信息通过以下 6 // 特性集控制。更改这些特性值可修改 7 // 与程序集关联的信息。 8 [assembly: AssemblyTitle("ClassLibrary1")] 9 [assembly: AssemblyDescription("")] 10 [assembly: AssemblyConfiguration("")] 11 [assembly: AssemblyCompany("微软中国")] 12 [assembly: AssemblyProduct("ClassLibrary1")] 13 [assembly: AssemblyCopyright("Copyright © 微软中国 2013")] 14 [assembly: AssemblyTrademark("")] 15 [assembly: AssemblyCulture("")] 16 17 // 将 ComVisible 设置为 false 使此程序集中的类型 18 // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, 19 // 则将该类型上的 ComVisible 特性设置为 true。 20 [assembly: ComVisible(false)] 21 [assembly: InternalsVisibleTo("ConsoleApplication1")] 22 // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 [assembly: Guid("5637efb6-680d-4966-b99a-6694a731816b")]
友元程序集的特性
1、单向性:也就是说,A将B声明为自己的友元程序集,可以让B访问A的internal类型和成员,可并不是说A可以访问B的Internal类型和成员,除非B将A声明为自己的友元程序集。
2、不可传递性:A将B声明为自己的友元程序集,这时C引用了B,可C不能访问A的internal类型和成员。
3、可以同时声明多个程序集为友元程序集

浙公网安备 33010602011771号