在 dotnet 裏面,可使用 InternalsVisibleToAttribute 特性,給程序集加上友元程序集,這樣能讓友元程序集訪問到 internal 的程序。也就是說若是我有 A 和 B 兩個程序集,我設置了 B 做爲 A 的友元程序集 那麼此時 B 程序集就能訪問 A 程序集裏面全部的 internal 成員。默認的友元設置只須要經過 InternalsVisibleToAttribute 特性寫入友元程序集名就能夠,可是若是程序集有強簽名,就須要加上公鑰php
假定我有 A 和 B 兩個程序集,我想要讓 B 能夠訪問到 A 程序集裏面全部的 internal 成員,那麼我能夠在 A 程序集裏面經過 InternalsVisibleToAttribute 加上友元程序集,以下面代碼算法
[assembly: InternalsVisibleTo("B")]
以上代碼須要寫在 using 下面,命名空間 namespace 定義的上面,基本上這個代碼都放在 AssemblyInfo.cs 文件裏面ide
但若是此時的 A 程序集是添加了強簽名的,那麼以上代碼將構建不經過工具
錯誤 CS1726 友元程序集引用「KicibehemNilaycahikem」無效。強名稱簽名的程序集必須在其 InternalsVisibleTo 聲明中指定一個公鑰。
添加了強簽名的程序集用途是說明這個程序集是誰發佈的,而沒有任何保密等做用。不過防篡改功能也是能夠經過強簽名實現的,在運行的時候判斷一下文件摘要信息和公鑰比對就能夠知道文件是否被篡改。但這樣作不到防破解和代碼保密等加密
而給程序集增強簽名的方法也很簡單,咱能夠自由建立本身的 snk 密鑰文件,這裏麪包含的是非對稱的加密。作法是右擊項目屬性,選擇爲程序集簽名,而後下拉選擇新建或使用現有的證書spa
新建的時候輸入證書名就能夠,能夠不加上密碼命令行
此時就能夠拿到 snk 密鑰文件,同時給程序集加上簽名了3d
而想要加入到友元的程序集,也須要簽名,對於友元程序集的簽名密鑰沒有要求,只要有簽名就能夠了。如上面例子的 B 程序集,也使用一個密鑰文件進行簽名,簽名以後,還須要將密鑰文件的公鑰寫到 InternalsVisibleTo 的參數裏面,格式以下code
[assembly: InternalsVisibleTo("B, PublicKey=******")]
那麼咱如何拿到 PublicKey 的值,上面代碼的 ****** 表明的只是 B 的公鑰。假定 B 程序集的密鑰文件是 dotnet-campus.snk 文件,那麼經過如下步驟就能夠拿到此密鑰文件的公鑰blog
先打開開發者命令行工具
在開發者命令行工具可使用 sn 命令,用到簽名工具。使用 sn 工具讀取出 dotnet-campus.snk 的公鑰,可使用下面代碼
sn -p "dotnet-campus.snk" "dotnet-campus.PublicKey.snk"
運行上面代碼將會建立 dotnet-campus.PublicKey.snk 文件,這個文件裏面將包含 dotnet-campus.snk 密鑰文件的公鑰
接下來咱使用下面命令輸出 dotnet-campus.PublicKey.snk 文件的公鑰
sn -tp dotnet-campus.PublicKey.snk
此時輸出的內容大概以下,這就是密鑰文件的公鑰
Microsoft(R) .NET Framework 強名稱實用工具 版本 4.0.30319.0 版權全部(C) Microsoft Corporation。保留全部權利。 公鑰(哈希算法: sha1): 002400000480000094000000060200000024000052534131000400000100010069a9f306e1a644 e0576651ebe3ec12a535f55f2268e50da02cfa9b969b6492a80a4c7bf7b17b9edb232fbfc0c617 8ea1f5ef58f3d82f25dfa7b6cf02e0bde35f879e45d8af6847fac7c1c1a5e855d915a552aef4f0 dc97d4cab25f70524ca74912121a1f2233c96cd501b5efc717d933bf15f23d256aa7cf37b9ce81 4fd2def1 公鑰標記爲 d9b785a303650e22
在代碼裏面將公鑰內容替換到上面的 ****** 內容,大概以下
[assembly: InternalsVisibleTo("B,PublicKey=002400000480000094000000060200000024000052534131000400000100010069a9f306e1a644e0576651ebe3ec12a535f55f2268e50da02cfa9b969b6492a80a4c7bf7b17b9edb232fbfc0c6178ea1f5ef58f3d82f25dfa7b6cf02e0bde35f879e45d8af6847fac7c1c1a5e855d915a552aef4f0dc97d4cab25f70524ca74912121a1f2233c96cd501b5efc717d933bf15f23d256aa7cf37b9ce814fd2def1")]
使用InternalsVisibleToAttribute給assembly添加「友元assembly」特性遭遇"強簽名" - jack_Meng - 博客園
我搭建了本身的博客 https://blog.lindexi.com/ 歡迎你們訪問,裏面有不少新的博客。只有在我看到博客寫成熟以後纔會放在csdn或博客園,可是一旦發佈了就再也不更新
若是在博客看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎你們加入
本做品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、從新發布,但務必保留文章署名林德熙,不得用於商業目的,基於本文修改後的做品務必以相同的許可發佈。若有任何疑問,請與我聯繫。