zoukankan      html  css  js  c++  java
  • 使用InternalsVisibleTo给assembly添加“友元assembly” internal关键字给指定Assembly掉用

    Lucene.Net 

    lucenenet/Lucene.Net.TestFramework.csproj at Lucene.Net_4_8_0_beta00013 · apache/lucenenet · GitHub

    <ItemGroup>
        <InternalsVisibleTo Include="Lucene.Net.Tests.Analysis.SmartCn" />
    </ItemGroup>

    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。

  • 相关阅读:
    【算法笔记】一大堆的筛法
    #总结dvwa
    网页挂马,网页篡改
    博客换新啦(PS:https://npfs06.top)
    SSTI题目整理(未完)
    近期一些面试问题的整理(安全方向)
    漏洞复现(利用、SRC挖掘)合集(二)
    SRC漏洞-从零到1的历程记录
    PHP代码审计(Session反序列化 + Create_function漏洞)
    XSS+CSRF思考(BCTF2018
  • 原文地址:https://www.cnblogs.com/GarsonZhang/p/13971232.html
Copyright © 2011-2022 走看看