友元程序集

  在上一节我们学习了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 }
View Code

这是一个类库,我们新建了一个类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 }
View Code

奇迹出现了,在这里居然可以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")]
View Code


友元程序集的特性

1、单向性:也就是说,A将B声明为自己的友元程序集,可以让B访问A的internal类型和成员,可并不是说A可以访问B的Internal类型和成员,除非B将A声明为自己的友元程序集。

2、不可传递性:A将B声明为自己的友元程序集,这时C引用了B,可C不能访问A的internal类型和成员。

3、可以同时声明多个程序集为友元程序集

 

 

 

 

posted @ 2013-12-11 00:16  迷你云  阅读(217)  评论(0)    收藏  举报