c# XXXXX由于其保护级别而无法访问
本文关键字:访问 XXXXX 于其 保护 | 更新日期: 2023-09-27 18:03:45
我遇到了"xxxx由于其保护级别而无法访问"的问题。我读过很多手册如何测试类与内部访问。我插入了
[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("UnitTests, PublicKey=mykey")]
将ProjectA中的放入我想要测试的类中。在我的TestProject中,我还添加了一个对ProjectA的引用。两者都有相同的*.snk。但是它一直抛出错误。
一些建议吗?
如果没有看到您的特定类,很难做到精确,但请确保以下内容:
- 您的类是
internal
或public
- 你的方法是
internal
-
InternalsVisibleTo
属性包含测试项目的完整名称空间。
。如果您的测试项目是MyProject.UnitTests
,那么您需要在InternalsVisibleTo
中有它,例如:
[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("MyProject.UnitTests")]
我从来没有使用过InternalsVisibleTo
的PublicKey部分,所以我不能对此发表评论,但是你可以尝试删除它。我通常不用它就能工作。
[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("MyProject.UnitTests")]
公钥值
假设这些都很好,它仍然不工作,我想这是与您输入的PublicKey值有关。在一个快速的网络搜索中,似乎您没有输入键名称,而是输入键值。要得到这个值,请遵循下面的一组指令来得到这个值。我将在这里引用说明,以供后人参考。
InternalsVisibleTo属性可用于允许其他程序集(例如您的Unit Test程序集)查看程序集的内部成员。与将单元测试放在主程序集中或使用VSTS特性自动生成私有成员的访问器相比,我更喜欢这种方法。(当你去重构一个项目时,这些真的很有趣…)
现在你会发现关于这个的大部分信息都是指早期的测试版使用。该属性用于接受PublicKeyToken,但现在接受PublicKey。
使用InternalsVisibleTo属性:
- 运行sn.exe -p MyStrongNameKey。snk MyStrongNameKey。PublicKey
这将把公钥解压缩到一个扩展名为. publickey的文件中。(我讨厌使用。pub扩展名,因为它被视为Microsoft Publisher文件…)
- 运行sn.exe -tp MyStrongNameKey。PublicKey
这将为您显示您的公钥。复制这个密钥。
创建如下属性:
[assembly: InternalsVisibleTo("我的项目。"UnitTests, PublicKey=PASTE-YOUR-PUBLIC-KEY-HERE")]
请注意,显示的公钥大约有5行。从公钥中删除换行符并将其粘贴到属性中。
您完成了!程序集MyProject。UnitTests现在可以看到程序集的内部成员