1. 程式人生 > 實用技巧 >使用InternalsVisibleTo給assembly新增“友元assembly” internal關鍵字給指定Assembly掉用

使用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。