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只好用来程序集,况兼你能够在同一个程序集种应用数13回。源程序集:饱含那天个性的顺序集。友元程序集能够看出源程序集的装有内部成员,类似于国有的。

   友元程序集实例介绍:

//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.CompilerServices.InternalsVisibleToAttribute”/>
类的新实例。接收多个友元程序集的称呼。

 
对于友元程序集有二个约束,如果三个友元程序集是签订协议的,那么源程序集为了有限辅助信任正确的代码,就需求内定友元程序集的公钥。

四.总结

 
 对于本文首借使在介绍友元程序集这一表征,顺带介绍程序集和定制Attribute那八个特点,方便我们明白友元程序集这一特点。那篇文章希望对大家享有援助,如故那句话,需者自取,也虚心接受吐槽。知识在于共享,更在乎每一人的思索。

 

相关文章

admin

网站地图xml地图