c# XXXXX由于其保护级别而无法访问

本文关键字:访问 XXXXX 于其 保护 | 更新日期: 2023-09-27 18:03:45

我遇到了"xxxx由于其保护级别而无法访问"的问题。我读过很多手册如何测试类与内部访问。我插入了

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

放入我想要测试的类中。在我的TestProject中,我还添加了一个对ProjectA的引用。两者都有相同的*.snk。但是它一直抛出错误。

一些建议吗?

c# XXXXX由于其保护级别而无法访问

如果没有看到您的特定类,很难做到精确,但请确保以下内容:

  • 您的类是internalpublic
  • 你的方法是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属性:

  1. 运行sn.exe -p MyStrongNameKey。snk MyStrongNameKey。PublicKey

这将把公钥解压缩到一个扩展名为. publickey的文件中。(我讨厌使用。pub扩展名,因为它被视为Microsoft Publisher文件…)

  1. 运行sn.exe -tp MyStrongNameKey。PublicKey

这将为您显示您的公钥。复制这个密钥。

  1. 创建如下属性:

    [assembly: InternalsVisibleTo("我的项目。"UnitTests, PublicKey=PASTE-YOUR-PUBLIC-KEY-HERE")]

  2. 请注意,显示的公钥大约有5行。从公钥中删除换行符并将其粘贴到属性中。

  3. 您完成了!程序集MyProject。UnitTests现在可以看到程序集的内部成员