InternalsVisibleTo属性不起作用
时间:2020-03-06 14:28:31 来源:igfitidea点击:
我试图使用InternalsVisibleTo
程序集属性使.NET类库中的内部类对我的单元测试项目可见。由于某种原因,我不断收到一条错误消息,内容为:
'MyClassName' is inaccessible due to its protection level
两个程序集均已签名,并且我在属性声明中列出了正确的密钥。有任何想法吗?
解决方案
编译好友程序集时,需要使用/ out:编译器开关。
不包含InternalsVisibleTo属性)。
编译器需要知道正在编译的程序集的名称,以确定是否应将生成的程序集视为好友程序集。
我们绝对确定我们具有属性中指定的正确公钥吗?
请注意,我们需要指定完整的公共密钥,而不仅仅是公共密钥令牌。看起来像:
[assembly: InternalsVisibleTo("MyFriendAssembly, PublicKey=0024000004800000940000000602000000240000525341310004000001000100F73 F4DDC11F0CA6209BC63EFCBBAC3DACB04B612E04FA07F01D919FB5A1579D20283DC12901C8B66 A08FB8A9CB6A5E81989007B3AA43CD7442BED6D21F4D33FB590A46420FB75265C889D536A9519 674440C3C2FB06C5924360243CACD4B641BE574C31A434CE845323395842FAAF106B234C2C140 6E2F553073FF557D2DB6C5")]
它是320左右的十六进制数字。不知道为什么我们可能需要仅使用在其他程序集引用中使用的公共密钥令牌来指定完整的公共密钥,所以有人会更容易欺骗朋友程序集的标识。
值得注意的是,如果"朋友"(测试)程序集是用C ++ / CLI而不是C#/ VB.Net编写的,则需要使用以下代码:
#using "AssemblyUnderTest.dll" as_friend
而不是项目参考或者通常的#using语句。由于某些原因,在项目参考UI中无法执行此操作。
科林
我们可以使用AssemblyHelper工具,该工具将为我们生成InternalsVisibleTo语法。这是最新版本的链接。请注意,它仅适用于强命名程序集。
如果程序集未签名,但是仍然出现相同的错误,请检查AssemblyInfo.cs文件中是否存在以下任一行:
[assembly: AssemblyKeyFile("")] [assembly: AssemblyKeyName("")]
如果存在这两个行中的一个(或者两个)行,"属性"选项卡仍将程序集显示为未签名,但是InternalsVisibleTo属性会将具有这些行的程序集视为强签名。只需删除(或者注释掉)这些行,它就可以正常工作。