我正在尝试使用InternalsVisibleTo程序集属性来使.NET类库中的内部类对我的单元测试项目可见。由于某些原因,我一直收到一条错误消息:
由于其保护级别,无法访问
'MyClassName‘
两个程序集都经过签名,并且我在属性声明中列出了正确的密钥。有什么想法吗?
发布于 2008-09-20 11:40:13
您是否绝对确定在属性中指定了正确的公钥?请注意,您需要指定完整的公钥,而不仅仅是公钥标记。它看起来像这样:
[assembly: InternalsVisibleTo("MyFriendAssembly,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100F73
F4DDC11F0CA6209BC63EFCBBAC3DACB04B612E04FA07F01D919FB5A1579D20283DC12901C8B66
A08FB8A9CB6A5E81989007B3AA43CD7442BED6D21F4D33FB590A46420FB75265C889D536A9519
674440C3C2FB06C5924360243CACD4B641BE574C31A434CE845323395842FAAF106B234C2C140
6E2F553073FF557D2DB6C5")]大概是320个十六进制数字。不确定为什么需要指定完整的公钥-可能只使用在其他程序集引用中使用的公钥标记,这样会更容易让人伪造友元程序集的身份。
发布于 2013-07-27 02:01:05
另一个可能的“陷阱”:您在InternalsVisibleToAttribute中指定的友元程序集的名称必须与您的友元程序集的名称完全匹配,如友元程序集的项目属性中所示(在选项卡中)。
在我的例子中,我有一个项目Thingamajig和一个配套项目ThingamajigAutoTests (为了保护有罪的人而更改了名称),这两个项目都产生了未签名的程序集。我在Thingamajig\AssemblyInfo.cs文件中适当地添加了属性[assembly: InternalsVisibleTo( "ThingamajigAutoTests" )],并如上所述注释掉了AssemblyKeyFile和AssemblyKeyName属性。Thingamajig项目构建得很好,但其内部成员顽固地拒绝出现在autotest项目中。
费尽心机之后,我重新检查了ThingamajigAutoTests项目的属性,发现程序集名称被指定为"ThingamajigAutoTests.dll“。Bingo -我在InternalsVisibleTo属性中的程序集名称中添加了".dll“扩展名,然后就准备就绪了。
有时候是最微不足道的事情...
发布于 2010-08-29 21:09:15
如果您的程序集未签名,但仍然收到相同的错误,请检查AssemblyInfo.cs文件中的以下两行之一:
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]如果存在这两行中的一行(或两行),则属性选项卡仍将程序集显示为无符号,但InternalsVisibleTo属性将具有这些行的程序集视为强有符号的。只需删除(或注释掉)这些行,它就可以很好地为您工作。
https://stackoverflow.com/questions/106880
复制相似问题