zoukankan      html  css  js  c++  java
  • 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")]
    

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

  • 相关阅读:
    python基础:8.正则表达式
    [Unity工具]批量修改字体
    产品理念(微博和Twitter)
    个性化推荐技术漫谈
    谱聚类算法(转自http://www.cnblogs.com/vivounicorn/archive/2012/02/10/2343377.html)
    Ubuntu输入正确密码后无法登录
    KMeans java实现(未用Hadoop版改进)
    Nutch安装指南
    KMeans的MapReduce实现
    特征向量的几何意义
  • 原文地址:https://www.cnblogs.com/liqipeng/p/4614982.html
Copyright © 2011-2022 走看看