2014-05-16 87 views
3

我遇到了「由於其保護級別而無法訪問xxxx」的問題。我已經閱讀了很多手冊如何測試內部訪問類。我已經插入c#XXXXX由於其保護級別而無法訪問

[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("UnitTests, PublicKey=mykey")] 

在ProjectA中成爲我想測試的類。在我的TestProject中,我也添加了對ProjectA的引用。兩者都有相同的* .snk。但它一直在拋出錯誤。

有些建議?

+3

想要分享一些代碼? –

+1

你確定使用的程序集名稱和私鑰是否正確? – PMF

+0

我只有一個內部類與幾個私人方法,當我試圖改變內部公共測試工作。 – bearbearbear

回答

6

沒有看到你的具體類,很難做到準確,但要保證以下幾點:

  • 你的類或者是internalpublic
  • 你的方法internal
  • InternalsVisibleTo屬性包含全測試項目的名稱空間。

也就是說,如果你的測試項目MyProject.UnitTests,那麼你需要有一個在你的InternalsVisibleTo,如:

[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("MyProject.UnitTests")] 

我從來沒有使用InternalsVisibleTo的公鑰部分,所以我不能評論,但你可以嘗試刪除它。通常沒有它的工作對我來說。

[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("MyProject.UnitTests")] 

公鑰值

假設這些無一不精,它仍然沒有工作,我猜這件事情跟你正在進入公鑰值。在快速網頁搜索中,看起來您並沒有輸入名稱的密鑰,而是輸入了密碼的值。爲了得到這個結果,請按照this指示來獲得該值。我將在這裏引用後人的指示。

InternalsVisibleTo Attribute可用於允許其他程序集(例如您的單元測試程序集)查看程序集的內部成員。我更喜歡這種方法,將單元測試放入我的主要程序集或使用自動生成訪問器的VSTS功能到我的私人成員。 (當你去重構一個項目時,這些真的很有趣......)

現在你會發現關於這個的大部分信息都是指早期的beta版本。用於獲取PublicKeyToken的屬性現在需要一個PublicKey。

要使用InternalsVisibleTo屬性:

  1. 運行SN.EXE -p MyStrongNameKey.snk MyStrongNameKey.PublicKey

這將提取到的公鑰與.PublicKey擴展名的文件。 (我討厭使用.pub擴展名,因爲它被視爲Microsoft Publisher文件...)

  1. run sn.exe -tp MyStrongNameKey。公鑰

這將顯示您的公鑰。複製此密鑰。

  1. 創建一個屬性爲這樣:即公共:[InternalsVisibleTo( 「MyProject.UnitTests,公鑰=糊狀YOUR-PUBLIC-KEY-HERE」)組件]

  2. 顯示的鍵是5行左右。從公鑰刪除換行符並將其粘貼到屬性中。

  3. 你完成了!程序集MyProject.UnitTests現在可以看到程序集的內部成員。

+0

我的課是inernal,方法也是內部的,但我試圖改變方法爲公共 - 沒有結果。根據你的例子,組件看起來沒問題。 – bearbearbear

+0

我更新了一些我發現RE公鑰的數據。 –

相關問題