InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集
友元程序集简介
我们知道一个类中被定义为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成员暴露给指定的友元程序集的更多相关文章
- public类型中internal成员
今天遇到一问题,找到下面的两篇文章,研究比较深入,特转了一下, 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原 ...
- 类中的internal成员可能是一种坏味道
前言 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原先只是有一丝细微的感觉,而现在将它和一些其他的方面进行了联 ...
- C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
知识点学习 类 const作用 C语言的const限定符的含义为"一个不能改变值的变量",C++的const限定符的含义为"一个有类型描述的常量": const ...
- C++:成员运算符重载函数和友元运算符重载函数的比较
5.2.4 成员运算符重载函数和友元运算符重载函数的比较 (1)对双目运算符而言,成员运算符重载函数参数表中含有一个参数,而友元运算符重载函数参数表中有两个参数:对于单目运算符而言,成员运算符重载函数 ...
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...
- 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 ...
- 《果壳中的C# C# 5.0 权威指南》 - 学习笔记
<果壳中的C# C# 5.0 权威指南> ========== ========== ==========[作者] (美) Joseph Albahari (美) Ben Albahari ...
- DevExpress源码编译总结 z
本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址 链接:http://pan.baidu.com/s/1eQm1 ...
- DevExpress源码编译总结
独家提供完整可编译sln文件,本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址 链接:http://pan.b ...
随机推荐
- visual studio 2012 的制作ActiveX、打包和发布
开发环境是Vs 2012 Framework 4.0 源码和制作工具在文章最下边 一. ActiveX控件Demo 新建一个Window窗体控件库项目 在自动生成的UserControl1页面上添加 ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- 怎样关闭google的自动更新
谷歌的自动更新很烦人的,只要你点击关于Google Chrome,谷歌就会自动更新成最新版本. 但是sencha框架好像与谷歌29.0以上的兼容性不是很好,所以关闭谷歌自动更新的需求来了,网上很多人说 ...
- Python使用基础
1) 基本概念1.1 常量 Python没有提供常量保留字,需要自行扩展一个常量类来实现常量功能 class _const: class ConstError(TypeError):pass def ...
- SSH登录之后运行命令报错的解决办法-- Failed to connect to Mir: Failed to connect to server socket: No such file or directory
问题描述: Failed to connect to Mir: Failed to connect to server socket: No such file or directory 解决方案: ...
- C 语言学习的第 04 课:编译器常见错误和警告(1)
同学们可能已经开始使用 C-Free 5 写自己的程序了.但是新手编程,总是会有一些磕磕绊绊.不要紧,在这篇文章中,就主要来了解一些编程开始时经常会遇到的语法方面的问题. warning: no ne ...
- mybatis缓存学习笔记
mybatis有两级缓存机制,一级缓存默认开启,可以在手动关闭:二级缓存默认关闭,可以手动开启.一级缓存为线程内缓存,二级缓存为线程间缓存. 一提缓存,必是查询.缓存的作用就是查询快.写操作只能使得缓 ...
- 0921MySQL 报错 ERROR 1290 (HY000): running with the --secure-file-priv
http://blog.itpub.net/26506993/viewspace-2121850/ mysql> show variables like '%secure%';+-------- ...
- sqlite之聚合函数的使用
聚合函数对一组值执行计算并返回单一的值.聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. ...
- Android NestedScrolling与分发机制 二
上篇转载了 Android:30分钟弄明白Touch事件分发机制 这篇转载 Android中的dispatchTouchEvent().onInterceptTouchEvent()和onTouchE ...