DotNet友元程序集分析

 
 项目支出的长河中,调节和测验使用的或是是最多的操作。任何代码写出来都亟需经过调节和测验和组成,以此扩展和晋级程序的平静和可信性。谈起.NET的单元测量试验,在那边就得提提.NET的友元程序集这一天性,也借用.NET举行单元测量试验的四个较为好用的.NET属性,来说学一下程序集、定制Attribute的有关文化。一些知识须要频仍的去品味和自省,不要以为你会了就忽略,等您放在心上的时候,你就某些无能为力的意思了。

   生活在于不停的煎熬,独有通过陶冶,才可见哪一天要求安分,曾几何时必要挑衅。

爱博体育,   毒鸡汤喝完了,来聊聊正事…

一.程序集概述

 
本文重假若座谈“友元程序集”的一对学问,既然是做多少个剖析,那么就活该把部分知识做三个进行来解说。在那边先谈谈程序集(有人感到很掌握,有人感觉完全不懂,意况不一,选用不相同,需者自取吧),接下去大家具体的看看程序集这一特色。

 
程序集是二个或七个模块/能源文件的逻辑分组,程序集是录取、安全性以及版本调节的矮小单元。对于程序集的构造有如下图。

爱博体育 1

爱博体育 2

   
对于程序集的组成就不一一做深入分析,在此间就独自谈谈元数据这一结构。元数据是二个二进制数据块,由一组数据表,元数据连接与包蕴IL代码的公文涉及,元数据由多少个表组成。元数据的效果有上海体育场地介绍。元数据的表有四个类型:定义表,引用表,清单表。对于这一个表的结构在此处就不做牵线了,有野趣的能够搜索一下,个人认为元数据这一结构应当好好的钻研一下。

二.定制Attribute概述

 
 上边的阐发中轻易的牵线了程序集的结商谈元数据,在此处差非常少的介绍一下定制Attribute这一.NET的风味。定制Attribute允许定义的信息使用于差相当少每一个元数据表记录项,这种可扩充的元数据音信能在运营时查询,进而动态改换代码的实行方式。在C#种,为了将一个定制Attribute应用于多个指标成分,须要将Attribute放置于目的成分前面包车型客车一对方括号中。

 
 CLMurano允许将定制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.CompilerServices.InternalsVisibleToAttribute”/>
类的新实例。接收三个友元程序集的名目。

 
对于友元程序集有多少个约束,要是八个友元程序集是签订契约的,那么源程序集为了确定保证信任准确的代码,就须要钦命友元程序集的公钥。

四.总结

 
 对于本文主假若在介绍友元程序集这一表征,顺带介绍程序集和定制Attribute这两性情形,方便大家精通友元程序集这一个性。那篇小说希望对大家有所支持,依然那句话,需者自取,也虚心接受调侃。知识在于分享,更在乎每一位的思虑。

 

相关文章