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")]
    

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

  • 相关阅读:
    swift中数组和字典得使用,及循环得使用方法(xcode6版本上所写代码)
    ScrollView各属性,及代理方法汇总
    贝塞尔曲线
    iOS基础教程-collectionView的应用
    iOS中,使用block传值简单应用
    ES6~Promise的原理及使用一(copy自: https://www.cnblogs.com/lvdabao/p/jquery-deferred.html)
    react~setState的运行机制
    react ~4.组件table的使用及表格分页处理
    react ~3.动态无限层级顶部菜单和左边菜单设计制作
    react ~2.登陆页面验证码的获取传递与刷新
  • 原文地址:https://www.cnblogs.com/liqipeng/p/4614982.html
Copyright © 2011-2022 走看看