2015-06-19 79 views
6

我正在使用「InternalsVisibleTo」屬性與程序集來公開內部方法/類到我的單元測試項目。如何使用具有強命名程序集的「InternalsVisibleTo」屬性?

我現在需要將該程序集安裝到GAC中,因此我需要給它一個強名稱。當我嘗試這樣做時,在Visual Studio中出現以下錯誤。

https://msdn.microsoft.com/en-us/library/bb763089.aspx

這篇文章中指出:

強名稱簽名的程序集必須在其InternalsVisibleTo聲明中

谷歌搜索的有點把我帶到下面的文章指定一個公鑰:

「確定pu爲強名的朋友大會準備鑰匙。「

本文沒有說如何確定公鑰。我在哪裏可以找到組件的公鑰?另外,一旦我擁有公鑰,這是否是聲明屬性的正確方法?

[assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")] 
+0

谷歌「.net程序集公鑰」並採取第一次打。 –

+0

我試過了。它表示要使用SN.exe,但只有在程序集被強烈簽名時纔有效。由於上述錯誤,我無法讓我的程序集編譯爲強類型。 SN.exe給出錯誤「.dll不代表強命名的程序集」 – Dave

+2

似乎你有雞和雞蛋顛倒了,你需要* other *程序集的公鑰。 –

回答

8

要使用InternalsVisibleTo具有強烈的簽名的程序集你的「朋友」組件必須堅決簽署了。

請注意,該屬性在編譯時並未用於實際的程序集驗證 - 它僅指定運行時檢查(以及編譯時檢查朋友程序集)是否應驗證該身份。因此,如果你只需需要編譯你的主程序集,你可以指定任何公鑰令牌(例如,在你的Web.Config的所有程序集引用中找到的一個來自微軟程序集的令牌)。

通常,因爲您將簽署程序集,您將知道公鑰。即如果你有snk文件比sn -t youSnk.snk會顯示公鑰。或者您可以按照Getting Public Key Token of Assembly Within Visual Studio中的步驟配置您的VS以顯示任何程序集的公共令牌。

1

如果沒有測試版本的配置,這是一個簡單的解決方法:

#if DEBUG 
[assembly: InternalsVisibleTo("TestProjNamespace")] 
#endif 
7

對於任何正在使用的Visual Studio 2017年,有最新的方法:

從我們敬愛的IDE ,進入 「工具>外部工具...」 和 「添加」 一個新的工具,這些設置:

  • 標題:獲取公鑰
  • 命令: 「C:\ Program Files文件(x86)的\微軟的SDK \的Windows \ v10.0A \ BIN \ NETFX 4.6.2工具\ SN.EXE」(/ \選擇與您的裝配NETFX版本相匹配的NETFX工具版本,這裏是4.6。2)
  • 參數:-TP $(TARGETPATH)
  • 選中 「使用輸出窗口」 複選框

應用/確定這些變化。

在「解決方案資源管理」 點擊你的項目集名稱,然後前往「工具>獲取公鑰」。 輸出窗口應顯示(相當長的)公鑰以及公共令牌密鑰。

最後,要公開持有的內部類(即測試項目)項目,打開「的AssemblyInfo.cs」文件,並添加一行:

[裝配:InternalsVisibleTo( 「MyCompany.SolutionName.ProjectName,公鑰= 粘貼你的公鑰這裏」)

/!\你要刪除行從您的公鑰打破。

它對我來說非常合適,所以希望它能爲你做好準備!

+1

也在Visual Studio 2015中工作:) – Kzrystof

+0

有用。謝謝。 – qwertoyo

相關問題