DotNet友元程序集深入分析

 
 项目支出的历程中,调节和测验使用的也许是最多的操作。任何代码写出来都亟待经过调节和测量检验和构成,以此扩展和升迁程序的平稳和可靠性。聊到.NET的单元测量检验,在此地就得提提.NET的友元程序集这一风味,也借用.NET举办单元测量试验的一个较为好用的.NET属性,来上课一下程序集、定制Attribute的相关知识。一些知识必要一再的去品味和自省,不要感觉你会了就大要,等你注意的时候,你就有个别力不从心的意趣了。

   生活在于不停的折腾,唯有经过陶冶,才可见什么时候要求安分,何时须要挑衅。

   毒鸡汤喝完了,来聊聊正事…

一.程序集概述

 
本文首要是座谈“友元程序集”的一部分知识,既然是做二个解析,那么就相应把一部分文化做叁位作品打开来阐释。在此间先谈谈程序集(有人以为很精晓,有人以为完全不懂,情形不一,选用区别,需者自取吧),接下去我们切实的看看程序集这一特色。

 
程序集是贰个或两个模块/财富文件的逻辑分组,程序集是重用、安全性以及版本调整的矮小单元。对于程序集的组织有如下图。

葡萄娱乐场 1

葡萄娱乐场 2

   
对于程序集的组成就不一一做剖析,在此间就独自谈谈元数据这一布局。元数据是二个二进制数据块,由一组数据表,元数据连接与含蓄IL代码的文书涉及,元数据由多少个表组成。元数据的法力有上海教室介绍。元数据的表有八个档期的顺序:定义表,援用表,清单表。对于那个表的结构在此间就不做牵线了,风乐趣的能够查找一下,个人感觉元数据这一布局应当好好的研讨一下。

二.定制Attribute概述

 
 上边的阐释中简易的牵线了先后集的布局和元数据,在这里差不离的介绍一下定制Attribute这一.NET的特点。定制Attribute允许定义的音信应用于大约每三个元数据表记录项,这种可扩充的元数据音讯能在运维时查询,从而动态改造代码的实践措施。在C#种,为了将五个定制Attribute应用于一个目标成分,要求将Attribute放置于目的成分前边的一对方括号中。

 
 CL卡宴允许将定制Attribute应用于可在文书的元数据中象征的大概具备因素。定制Attribute首要使用于程序集、模块、类型、字段、方法、方法参数、方法再次来到值、属性、事件、泛型类型参数。attribute是类的三个实例,将三个attribute应用于一个指标成分时,语法类似于调用类的有些实例构造函数。定制Attribute的实举例下:

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]

   
上边代码取自InternalsVisibleToAttribute类中,该类是到位友元程序集性子的着力目的,上面会做贰个切实的介绍。AttributeUsage要求经受叁个AttributeTargets枚举类型的值作为参数,称之为定位参数,是强制性的,必须钦定。AllowMultiple参数用于获取或设置八个布尔值,提示是或不是有多个实例钦赐的习性可以为单个程序元素钦命。Inherited参数用于获取或设置贰个布尔值,提示钦点的属性是还是不是可以承继由派生类和重写成员。

 
 定制Attribute能够选拔于单个指标元素,定制Attribute的依次是开玩笑的。在C#种,可将每一个Attribute都封闭到一对方括号中,也能够在有个别方括号中查封多少个以逗号分隔的Attribute。

 
 定制Attribute便是三个类的实例,它被类别化成驻留在元数据中的二个字节流,在运转时,能够对元数据中蕴藏的字节举办反类别化,从而构造类的二个实例。

三.友元程序集分析

 
 扯了半天,终于到教授“友元程序集”那四个概念,“友元程序集”在.NET第22中学提议,使用InternalsVisibleToAttribute来兑现这一特征,InternalsVisibleTo只可以用来程序集,并且你能够在同叁个主次集种应用多次。源程序集:包涵这么些本性的顺序集。友元程序集能够见到源程序集的有着内部成员,类似于国有的。

   友元程序集实例介绍:

//AssemblySource.DLL
[assembly: InternalsVisibleTo(DotNetShare)]
public class AssemblySource
{
    public static void Share();
}


//DotNetShare.DLL
public class DotNetShare
{
    private static void Main()
    {
        AssemblySource.Share();
    }
}

   
AssemblySource.DLL和DotNetShare.DLL之间存在一种特别的涉嫌,不过这种关系只能单项操作。接下来看一下InternalsVisibleToAttribute的完结源码。InternalsVisibleToAttribute承继自Attribute类,该类钦点经常仅在时下先后聚集可知的门类对点名程序集可知。该类包蕴五个属性和叁个格局。

   1.AssemblyName

public string AssemblyName
    {
      [__DynamicallyInvokable] get
      {
        return this._assemblyName;
      }
    }

 
 该属性为贰个只读属性,多个代表友元程序集名称的字符串。该属性用于获取友元程序集的名称,选用internal 关键字标识的具有品类和连串成员对该程序集均为可知。

  2.InternalsVisibleToAttribute()

public InternalsVisibleToAttribute(string assemblyName)
    {
      this._assemblyName = assemblyName;
    }

葡萄娱乐场,   该情势为四个构造函数,用钦点的友元程序集的名称初步化 <see
cref=”T:System.Runtime.Compiler瑟维斯s.InternalsVisibleToAttribute”/>
类的新实例。接收二个友元程序集的名号。

 
对于友元程序集有二个羁绊,要是二个友元程序集是签订契约的,那么源程序集为了确认保证信任精确的代码,就须求钦点友元程序集的公钥。

四.总结

 
 对于本文主假若在介绍友元程序集这一特色,顺带介绍程序集和定制Attribute这两性子情,方便大家精通友元程序集这一表征。那篇小说希望对咱们有着支持,依然这句话,需者自取,也虚心接受捉弄。知识在于分享,更在乎每壹位的商量。