C#的internal关键字可以使标记的方法,字段或者属性等等只能在当前assembly内部使用,那么如果其他的assembly需要使用这个internal的方法的时候怎么办呢?.NET提供了一种类似于C++中的友元类的方式来完成这个功能,那就是使用InternalsVisibleTo。

这种情况常见于做测试的时候,需要另外一个项目来测试项目中的internal方法所标记的功能,所以有了InternalsVisibleTo,我们就不用为了做单元测试而把一个本不该公开的方法改为public了.

使用InternalsVisibleTo还有一些需要注意的地方,特别是PublicKey不太容易弄的明白,下面先来说说这个InternalsVisibleTo该怎么使用:

先来说明一下前提:Project1是功能项目,Project1.Test (assembly name: Project1.Test.dll)是为做Project1的测试工程。

1. 打开Project1的Assembly.cs文件,在文件的末尾加上这样一句话:

  [assembly: InternalsVisibleTo("Project1.Test, PublicKey=******")]

其中PublicKey=******应该替换成Project1.Test.dll的public key,至于如何获取PublicKey,请看文章末尾的Notes部分.

2. 确认namespace: System.Runtime.CompilerServices 添加到了Assembly.cs的namespace引用中,因为InternalsVisibleTo位于命名空间System.Runtime.CompilerService中。

Notes:

1. 如何获取PublicKey?

A: 在命令行下,使用sn -Tp Project1.Test.dll就可以看到PublicKey和PublicKeyToken

2. 如果Project1是个strong-named的项目,那么InternalsVisibleTo必须指定PublicKey,所以Project1.Test也必须使用强签名才能正确使用InternalsVisibleTo, 不然编译会出错,如果Project1没有使用强签名,那么Project1.Test也不必使用强签名,而且在使用InternalsVisibleTo的时候只需要程序集的名字就可以了,不需要设置PuklicKey。

使用InternalsVisibleTo给assembly添加“友元assembly”的更多相关文章

  1. 使用InternalsVisibleToAttribute给assembly添加“友元assembly”特性遭遇"强签名"

    一.如何让Intenal成员暴露给另一个程序集 我们知道Modifier为Internal的类型成员仅限于当前程序集能够访问,但是在某些情况下,我们希望将它们暴露给另一个程序集.比较典型的应用场景包括 ...

  2. 慎用Assembly.LoadFile()和Assembly.LoadFrom()

    经测这俩方法会锁住文件,导致程序运行期间无法对load过的程序集文件进行更名/删除/覆盖等等操作,考虑用Assembly.Load()文件字节组替代: Assembly.Load(File.ReadA ...

  3. .NET:Assembly.CodeBase vs. Assembly.Location

    The CodeBase is a URL to the place where the file was found, while the Location is the path from whe ...

  4. 配置到 Framework GAC(Global Assembly Cache) Assembly

    配置到 Framework 通常有两种方法,一种是直接把它放到GAC(Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly)中 :另一种是把它们放到具体 ...

  5. 关于Assembly.LoadFrom和Assembly.LoadFile的区别

    区别: 1.Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("a.dll"),则载入a.dll,假如a.dll中引用了b.dll的 ...

  6. c# 添加reference后,Visual Studio 仍然提示无法找到函数, 询问是否添加了含有这个函数的Assembly

    1.问题 添加reference后,编译仍然无法通过,测试工程添加这个assembly 就可以编译通过. 对比了这个assembly的 .net 版本,也没问题 由于工程是x64的, 添加的assem ...

  7. How to make your assembly more secure from referencing by unauthorized bits

    Now the security has a trend to become more and more important in our daily work, hence I did some r ...

  8. [转]C#反射-Assembly.Load、LoadFrom与LoadFile进阶

    关于.NET中的反射,常用的有三个方法: Assembly.Load()Assembly.LoadFrom()Assembly.LoadFile() 下面说说这三个方法的区别和一些细节问题 1. As ...

  9. C#中的反射 Assembly.Load() Assembly.LoadFrom()

    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...

随机推荐

  1. Python开发【内置模块篇】datetime

    获取当前日期和时间 >>> from datetime import datetime >>> now = datetime.now() >>> ...

  2. HBase实践案例:车联网监控系统

    项目背景 本项目为车联网监控系统,系统由车载硬件设备.云服务端构成.车载硬件设备会定时采集车辆的各种状态信息,并通过移动网络上传到服务器端.服务器端接收到硬件设备发送的数据首先需要将数据进行解析,校验 ...

  3. Java多线程——中断机制

    前言:在Java多线程中,中断一直围绕着我们,当我们阅读各种关于Java多线程的资料.书籍时,“中断”一词总是会出现,笔者对其的理解也是朦朦胧胧,因此非常有必要搞清楚Java多线程的中断机制. 1.J ...

  4. JS正则四个反斜杠的含义

    我们首先来看如下代码,在浏览器中输出的是什么? // 在浏览器中输出的 console.log('\\'); // 输出 \ console.log('\\\\'); // 输出 \\ 一:js正则直 ...

  5. centos搭建ftp服务器

    申请个京东云服务用着.上传文件想搭建个ftp服务.遇到个坑记录一下: 这里就简单的使用yum安装 ftp服务: vsftpd  全称 very secure ftp deamon  (非常安全的ftp ...

  6. 基于 HTML5 WebGL 的 3D 棉花加工监控系统

    前言 现在的棉花加工行业还停留在传统的反应式维护模式当中,当棉花加下厂的设备突然出现故障时,控制程序需要更换.这种情况下,首先需要客户向设备生产厂家请求派出技术人员进行维护,然后生产厂家才能根据情况再 ...

  7. docker 在centos6 和centos7上的区别

    这些天研究了下docker,在centos6.6上装了个docker1.7.1,在centos7.6上装了个docker18.09.0 两者还是有区别的. 1.配置docker国内镜像加速  Dock ...

  8. Scrapy中选择器的用法

    官方文档:https://doc.scrapy.org/en/latest/topics/selectors.html Using selectors Constructing selectors R ...

  9. 基于Flask 实现Web微信登陆

    网页版微信登陆网址 https://login.wx.qq.com/ 获取微信登陆的二维码 在浏览器中访问登陆接口 https://login.wx.qq.com/ 我们查找二维码的图片可以看到 其中 ...

  10. Web并发页面访问量统计实现

    Web并发页面访问量统计实现 - huangshulang1234的博客 - CSDN博客https://blog.csdn.net/huangshulang1234/article/details/ ...