友元程序集简介

我们知道一个类中被定义为internal的成员(包括类型、方法、属性、变量、事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问)。这个规则在.NET2.0稍稍被打破,InternalsVisibleToAttribute允许我们设置一个程序集的internal的成员可以被特定的成员访问到。我们把包含这些internal成员的程序集称为源程序集(source assembly),而这个设定的程序集称为友元程序集(friend assembly)。

友元程序集使用

这个Attribute是是使用于程序集级别的。

using System;

[assembly:InternalsVisibleTo("FriendAssembly")]
public class Class1
{
internal string Name { get; set; }
}

那这样FriendAssembly程序引用了该程序集之后,就可以访问到internal的Name属性。

一般这个assembly:InternalsVisibleTo("FriendAssembly")放在AssemblyInfo.cs里比较好,毕竟它是程序集级别的。

什么情况下使用InternalsToVisibleTo

其实,在一般的应用中也用不上这个Attribute,而且我们也不应该滥用这个属性。因为一般情况下,设计合理的程序集是不需要对外开放internal成员的访问的。

但是单元测试的场景是可以利用一下这个特性的。有了这个特性,我们可以指定让单元测试的代码可以访问那些internal成员,这样就可以对这些成员进行单元测试了。不过这样需要在源程序集里将友元程序集的名称写死了,这回造成一些安全问题。可以通过引入签名程序集来保证安全。

InternalsToVisibleTo和签名程序集

可以直接给InternalsVisibleTo指定友元程序集的名称和公钥。

使用VS开发者命令行生成FriendAssembly的公钥:

sn -Tp FriendAssembly.dll

给源程序集指定友元程序集的名称以及公钥:

[assembly:InternalsVisibleTo("FriendAssembly, PublicKey=00200220202......3a3b3c")]

实际上,由于友元程序集会引用源程序集,而且签名的程序集引用一个未签名的程序集、签名的程序集也不能指定一个未签名的友元程序集,所以其中任何一个程序集签名了,那它们就都需要进行签名。

InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集的更多相关文章

  1. public类型中internal成员

    今天遇到一问题,找到下面的两篇文章,研究比较深入,特转了一下, 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原 ...

  2. 类中的internal成员可能是一种坏味道

    前言 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原先只是有一丝细微的感觉,而现在将它和一些其他的方面进行了联 ...

  3. C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)

    知识点学习 类 const作用 C语言的const限定符的含义为"一个不能改变值的变量",C++的const限定符的含义为"一个有类型描述的常量": const ...

  4. C++:成员运算符重载函数和友元运算符重载函数的比较

    5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...

  5. 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?

    static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...

  6. About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。

    If only member function clear of WindowMgr is a friend of Screen, there are some points need to note ...

  7. 《果壳中的C# C# 5.0 权威指南》 - 学习笔记

    <果壳中的C# C# 5.0 权威指南> ========== ========== ==========[作者] (美) Joseph Albahari (美) Ben Albahari ...

  8. DevExpress源码编译总结 z

    本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址 链接:http://pan.baidu.com/s/1eQm1 ...

  9. DevExpress源码编译总结

    独家提供完整可编译sln文件,本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址  链接:http://pan.b ...

随机推荐

  1. React入门 (1)—使用指南(包括ES5和ES6对比)

    前言 本篇会简明扼要的介绍一下React的使用方法.代码会用JSX+ES5和JSX+ES6两种方式实现. React简介 React来自Facebook,于2013年开源.至今不断修改完善,现在已经到 ...

  2. who命令的总结

    who命令能做什么 who命令用来查看谁登录了系统(show who is logged on ): 每一行代表一个巳经登录的用户,第1列是用户名,第2列是终端名,第3列是登录时间. 通过whatis ...

  3. Theano2.1.7-基础知识之设置的配置和编译模式

    来自:http://deeplearning.net/software/theano/tutorial/modes.html Configuration Settings and Compiling ...

  4. 深入grootJs(进阶教程)

    深入grootJs 这篇教程的原则是把grootJs原理讲透,主要真正理解了原理才能用起来随心所欲 mvvm模式简介 grootJs的vm结构 扫描函数sweep 垃圾回收的原理 加载器中的预编 ,控 ...

  5. SNMP 原理与实战详解

    原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  6. Service之来电监听(失败的案例)

    Service:服务,可以理解成一个运行再后台没有界面的Activity,集成于Seriver,是四大组件之一 Service的继承关系:Service-->ContextWrapper--&g ...

  7. go linux 学习记录

    1 yum install mercurial 安装mercurial包 2 yum install git 安装git包 3 yum install gcc 安装gcc 4  然后就可以下载gola ...

  8. __getattr__与__getattribute__

    class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print("执行的是我----->&qu ...

  9. android部分开发摘要

    Async 异步  不会阻塞当前线程sync  同步 数据库是应用软件|结构化数据存储  JDBC  SQL ellipsis 省略 content provider   URI thread--lo ...

  10. ubuntu完全卸载nginx

    删除nginx连带配置文件 sudo apt-get purge nginx # Removes everything. 卸载不再需要的nginx依赖程序 sudo apt-get autoremov ...